觉得自己用了最蠢的方法,但也是自己写出来的,感谢我的表哥,给我改了错误。
1、错误
- 反转的时候上限写错了,应该全是k/2好吗!!!!
- 一开始用了静态变量,表哥说没必要!!
2、思路
- 设置m是字符串长度对2k取余。
- 若m=0,则就是对每2k个长度前k个字母取余modvalue
- 若m!=0,则有两种情况,第一种长度小于2k,第二种长度是由n*2k+modvalue
- 注意反转,无论modvalue是奇数还是偶数,均是i<modvalue/2,不用分情况,第一道反转字符串还傻不拉几分奇数和偶数
3、代码实现
1 class Solution { 2 public: 3 string reverseStr(string s, int k) { 4 5 int s_length=s.size(); 6 int m=2*k; 7 if(s_length%m==0){//如果字符串长度是2k的倍数 8 int n=s_length/m;//计算有几个2k 9 for(int i=1;i<n+1;i++) 10 { 11 for(int j=2*(i-1)*k;j<2*(i-1)*k+k/2;j++) 12 { 13 14 char temp; 15 temp=s[j]; 16 s[j]=s[2*(i-1)*k+k-1-(j-2*(i-1)*k)];//之前定义静态变量,这里直接替换 17 s[2*(i-1)*k+k-1-(j-2*(i-1)*k)]=temp; 18 19 } 20 } 21 } 22 else 23 { 24 int modvalue=s_length%m; 25 int n=s_length-modvalue;//判断这个字符串是不是总长就小于2k 26 if(n==0) 27 { 28 if(modvalue>k) 29 { 30 for(int i=0;i<k/2;i++) 31 { 32 char temp; 33 temp=s[i]; 34 s[i]=s[k-1-i]; 35 s[k-1-i]=temp; 36 } 37 } 38 else 39 { 40 for(int i=0;i<modvalue/2;i++) 41 { 42 char temp; 43 temp=s[i]; 44 s[i]=s[modvalue-1-i]; 45 s[modvalue-1-i]=temp; 46 } 47 } 48 } 49 else 50 { 51 int k1=n/m; 52 for(int i=1;i<k1+1;i++)//先反转2k内的所有前k个字符 53 { 54 for(int j=2*(i-1)*k;j<2*(i-1)*k+k/2;j++) 55 { 56 char temp; 57 temp=s[j]; 58 s[j]=s[2*(i-1)*k+k-1-(j-2*(i-1)*k)]; 59 s[2*(i-1)*k+k-1-(j-2*(i-1)*k)]=temp; 60 } 61 } 62 if(modvalue>k) 63 { 64 for(int i=k1*2*k;i<k1*2*k+k/2;i++)//反转余数个字符 65 { 66 67 char temp; 68 temp=s[i]; 69 s[i]=s[k1*2*k+k-1-(i-k1*2*k)]; 70 s[k1*2*k+k-1-(i-k1*2*k)]=temp; 71 72 } 73 } 74 else 75 { 76 for(int i=k1*2*k;i<k1*2*k+modvalue/2;i++) 77 { 78 char temp; 79 temp=s[i]; 80 s[i]=s[k1*2*k+modvalue-1-(i-k1*2*k)]; 81 s[k1*2*k+modvalue-1-(i-k1*2*k)]=temp; 82 83 } 84 } 85 } 86 } 87 return s; 88 89 } 90 91 };
4、运行结果