倒置字符串原题链接
倒置字符串_好未来笔试题_牛客网 (nowcoder.com)
下面给出代码:
#include <stdio.h>
#include <string.h>
void reverse(char* left, char* right)
{
while (left < right)
{
char tmp = *left;
*left = *right;
*right = tmp;
left++;
right--;
}
}
int main()
{
char arr[100] = { 0 };
gets(arr);
int len = strlen(arr);
//逆序整个字符串
reverse(arr, arr + len - 1);
//逆序单词
char* cur = arr;
char* start = arr;
while (*cur != '\0')
{
while (*cur != ' ' && *cur != '\0')
{
cur++;
}
reverse(start, cur - 1);
if (*cur != '\0')
{
start = cur + 1;
cur++;
}
}
printf("%s\n", arr);
return 0;
}
思路是先逆序整个字符串再逆序每个单词
注意的是在逆序每个单词时,当*cur为空格时,cur-1才是一个单词的结尾,cur+1是下一个单词开始的位置,逆序单词是一个重复的过程,所以当cur != '\0'时循环不断进行,而在逆序单词的时候,当*cur=‘\0’时,说明所有单词已经逆序完毕,所以此时的cur就不需要再++,start指针也就不需要重新赋值了。
单词倒排问题原题链接:
代码如下:
#include <stdio.h>
int main()
{
char str[10001] = { 0 };//字符串最长10000
int row = 0;
while (gets(str) > 0)
{
char* ptr = str;
char* word[10000] = { NULL };
while (*ptr != '\0')
{
//如果是个字母字符,则是单词的起始字符
if (('z' >= *ptr && *ptr >= 'a') || ('Z' >= *ptr && *ptr >= 'A'))
{
word[row++] = ptr;//保存每个单词的起始地址
//把本次的单词字母字符走完,直到遇到非字母字符
while((*ptr != '\0') &&('z' >= *ptr && *ptr >= 'a') || ('Z' >= *ptr && *ptr >= 'A'))
{
ptr++;
}
continue;//不能继续向下,因为下边的ptr++会跳过当前的非字母字符
}
*ptr = '\0';//把非字母的数据全部替换为结尾标志
ptr++;
}
for (int i = row - 1; i >= 0; i--)
{
printf("%s ", word[i]);//针对所有单词的起始地址逆序开始打印即可
}
return 0;
}
}
注释很详细,不再赘述。
水平有限欢迎指正。