题目链接:344. 反转字符串 - 力扣(LeetCode)
很简单,双指针向中间遍历交换
代码复现:
void reverseString(char* s, int sSize){
int i = 0, j = sSize - 1;
while(i <j){
char t = s[i];
s[i++] = s[j];
s[j--] = t;
}
}
题目链接:541. 反转字符串 II - 力扣(LeetCode)
以下是我写的错误代码:就是不能完全按照题目的逻辑来,要理解题目的意思后,对题目进行一个整体的把握(我好想睡觉啊啊啊啊,可是我还有很多事情没做。。。。。。。。。明日复明日,明日何其多。。。
char * reverseStr(char * s, int k){
int sl = strlen(s);
int i = 0, slow = k - 1, fast = 2 * k - 1;
char t;
while(i < slow){
t = s[i];
s[i] = s[slow];
s[slow] = s[i];
i++,slow--;
}
if((sl - fast) < k){
slow = fast + 1,fast = sl - 1;
}
else if((sl - fast) < 2*k && (sl - fast) >= k){
slow = fast + 1, fast = slow + k;
}
while(slow < fast){
t = s[slow];
s[slow] = s[fast];
s[fast] = s[slow];
slow++,fast--;
}
return s;
}
思路:可以想成在字符串i里面寻找一个区间,区间的长度是2k,所以就让下标每次移动2k步就好,在这个区间内,将左指针放在区间开头,右指针放在这个区间的第k个位置,进行反转操作
代码复现:
char * reverseStr(char * s, int k){
int i;
int sl = strlen(s);
for(i = 0; i < sl; i += 2*k){
//如果剩下的字符不只k个的话,那么就仍然存在这样的区间可以对字符串进行反转
//如果剩下的字符比k小的话,直接将下标定位在数组最后一个元素,将此区间后面的字符串全部反转
k = len - i < k ? len - i : k;
//定义左右指针
int left = i;
int right = i + k - 1;
while(left < right){
char t = s[left];
s[left] = s[right];
s[right] = t;
left++,right--;
}
}
return s;
}
看了一下151的思路,理解了,但是还需要自己动手写一遍,今天就先到这里吧,再不搞数学我就要477了。。。。