觉得自己用了最蠢的方法,但也是自己写出来的,感谢我的表哥,给我改了错误。

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、运行结果

01-15 21:06