day39反转字符串总结
反转字符串原理其实就是交换位置,以中间为分隔点;
基本套路:遍历前一般字符,互换位置;
for循环模板
void reverseString(char* s, int sSize){char temp;for (int i = 0, j = sSize - 1; i < sSize/2; i++, j--) {temp = s[i];s[i] = s[j];s[j] = temp;}
}
while模板
void reverse(char *s,int left,int right) {char ch;while(left < right) {ch = s[left];s[left] = s[right];s[right] = ch;left++;right--;}
}
题目1
void reverse(char *s,int left,int right) {char ch;while(left < right) {ch = s[left];s[left] = s[right];s[right] = ch;left++;right--;}
}
char * reverseStr(char * s, int k){int len = strlen(s);for(int i = 0; i < len; i += (2 * k)) {if( i + k > len) {reverse(s,i, len -1);} else {reverse(s, i, i + k -1);}}return s;}
题目2
思路:strlen(s) 遇到\0 停止
1.怎么判定一个单词?单词的下一个字符是空格
2.反转字符串每个单词的字符顺序,那么把每个单词当做一个小字符串来处理
3.确定边界.字符串以空字符结尾,空字符的下一个字符才是第二个单词的开始。
void reverse(char *s, int left, int right){char temp;while (left < right) {temp = s[left];s[left] = s[right];s[right] = temp;left++;right--;}
}
char * reverseWords(char * s){int len = strlen(s);//只能得到let的长度int i = 0;while (i < len) {int start = i; // 新单词开始的长度while(i < len && s[i] != ' ') {i++;//统计单词长度}reverse(s,start,i -1);while(i < len && s[i] == ' ') {// 该单词完成反转 跳到下一个单词i++;}}return s;
}
void swap(char *c1, char *c2) {char tmp = *c1;*c1 = *c2;*c2 = tmp;
}char *reverseOnlyLetters(char *s){int n = strlen(s);int left = 0, right = n - 1;while (true) {while (left < right && !isalpha(s[left])) { // 判断左边是否扫描到字母left++;}while (right > left && !isalpha(s[right])) { // 判断右边是否扫描到字母right--;}if (left >= right) {break;}swap(s + left, s + right);left++;right--;}return s;
}
题目三;
void reverseString(char* s, int sSize){char temp;for (int i = 0, j = sSize - 1; i < sSize/2; i++, j--) {temp = s[i];s[i] = s[j];s[j] = temp;}
}
题目四:
用 “ the sky is blue ” 举例说明,源字符串长度为 21。
移除多余的空格:“the sky is blue”(此时字符串的长度变为了 15)
反转整个字符串:“eulb si yks eht”
反转每一个单词:“blue is sky the”
void reverse(char* s, int start, int end) {while (start < end) {char temp = s[start];s[start++] = s[end];s[end--] = temp;}
}
char * reverseWords(char * s){// 1. 移除多余空格int len = strlen(s);int fast = 0, slow = 0;// 移除字符串之前的空格while (s[fast] == ' ') {fast++;}// 移除单词之间多余的空格while (fast < len - 1) {if (s[fast] == ' ' && s[fast + 1] == ' ') {fast++;} else {s[slow++] = s[fast++];}}// 移除字符串后面的空格if (s[fast] == ' ') {s[slow] = '\0';} else {s[slow++] = s[fast];s[slow] = '\0';}// 2. 反转整个字符串reverse(s, 0, slow - 1);// 3. 反转每一个单词for (int i = 0; i < slow; i++) {int j = i;while (j < slow && s[j] != ' ') {j++;}reverse(s, i, j - 1);i = j;}return s;
}