class Solution { public: string reverseStr(string s, int k) { int n = size(s); for(int i=0;i<n;i+=2*k) { int left=i; int right=min(i+k-1,n-1); while(left<=right) { swap(s[left],s[right]); left++; right--; } } return s; } };
思路:
题目理解:对一个字符串,前k个反转,后k个不反转,依此类推 ......
1.设一个循环,实现间隔2k进行操作;
2.循环中实现前k个反转;
问题:
1.右边界的定义为什么是min(i+k-1,n-1)
i+k-1 类比left =0,right=k-1;left = i,right = i+k-1;
当s=abc
i=0 ,i=2时,left = 2,right =2+2-1=3,s[2] = 'c';s[3]不存在:超出数组边界索引
预期输出是bac
n-1 =3-1=2;是不变的。
怎么想到这一点?-----为了不超出边界索引,故而n-1
第三题:
题目描述:将给定字符串中的数字替换为number
#include<iostream> #include<cstring> using namespace std; int main(){ string s; cin>>s; int count = 0; int len = s.length(); for(int i=0;i<len;i++){ if(s[i]>='0' && s[i]<='9') count++; } int Oldsize= len; int Newsize= len+6*count; int j; j=Newsize-1; s.resize(Newsize); //s[Newsize]='\0'; // Null-terminate the new string 为啥这句不加会错 for(int i=Oldsize;i>=0;i--){ { if (s[i]>='0' && s[i]<='9'){ s[j--]='r'; s[j--]='e'; s[j--]='b'; s[j--]='m'; s[j--]='u'; s[j--]='n'; } else{ s[j--]=s[i]; } } } std::cout<<s<<endl; return 0; } // 思路: // 1.首先扩容(for循环统计数字个数,确定新的数组长度) // 2.从后往前开始遍历,遇到数字开始替换; // 问题: // 1.(基本)printf("%s",s)//这里不需要取地址,因为数组名本身就是地址; // 2.换成string后,要先扩展字符串的大小; // 3.s[Newsize]='\0';C风格balaa;nce需要字符串以
浙公网安备 33010602011771号