反转字符串原理其实就是交换位置,以中间为分隔点;
基本套路:遍历前一般字符,互换位置;
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;
}