【寒假每日一题】DAY8 倒置字符串
牛客网链接:传送门
【❤️温馨提示】自己做一遍,再看解析效果更佳哟
描述
将一句话的单词进行倒置,标点不倒置。
输入描述:
每个测试输入包含1个测试用例: I like beijing. 输入用例长度不超过100
输出描述:
依次输出倒置之后的字符串,以空格分割
示例1
输入:
I like beijing.
输出:
beijing. like I
思路:这题可以先逆序整个字符串,然后再分别逆序每一个单词;又或者还可以先逆序每一个单词,然后再逆序整个字符串。
那么这题我就先逆序字符串,再逆序每一个单词来讲解吧
第一步:根据题目要求输入字符串
第二步:逆序整个字符串
第三步:逆序每一个单词
第四步:输出数组a
详细过程下面
第一步:根据题目要求输入字符串
首先,根据输入描述,输入的长度不能超过100,我们就不防多加一个
其次,因为scanf默认读到空格就不会再读取了,所以用gets。
#include <stdio.h>
int main()
{
char arr[101];
//输入字符串
gets(arr);
return 0;
}
第二步:逆序整个字符串
可以封装一个reverse函数专门来逆序,参数可以分别传数组的左下标和右下标,然后在函数内部对它们进行交换
#include <stdio.h>
#include <string.h>
void reverse(char* left, char* right)
{
//当left < right说明还有元素可以交换
while(left < right)
{
char tmp = *left;
*left = *right;
*right = tmp;
left ++;
right--;
}
}
int main()
{
char arr[101];
//输入
gets(arr);
//逆序整个字符串
int sz = strlen(arr); //求字符串长度
reverse(arr,arr + sz - 1);
return 0;
}
第三步:逆序每一个单词
逆序每一个单词确实头疼,但是我们还可以运用上一步reverse函数还帮助逆序,但需要分别找到单词的左下标和右下标。
注意,千万不能移动arr,因为最后还要靠arr来输出字符串,所以可以用char* p来存放arr来代替arr移动,然后再用char* start = p来固定起始位置
接下来让p往后判断,只要p不为空格并且p不等于“\0”就能完整找到一个单词,所以这是一个循环,如果最后单词不是“\0”结尾,说明还能找到单词,就让p继续向后走,所以这整体就是一个循环,其条件是让p到达“\0”位置就停下来,“\0”的asc码值为0.
【代码实现】
#include <stdio.h>
#include <string.h>
void reverse(char* left, char* right)
{
//当left < right说明还有元素可以交换
while(left < right)
{
char tmp = *left;
*left = *right;
*right = tmp;
left ++;
right--;
}
}
int main()
{
char arr[101];
//输入
gets(arr);
//逆序整个字符串
int sz = strlen(arr); //求字符串长度
reverse(arr,arr + sz - 1);
//逆序每一个单词
char* p = arr;
while(*p) //若*p == '\0','\0'的ASC码为0,则会跳出循环
{
char* start = p;
while(*p != ' ' && *p != '\0')
{
p++;
}
//当*p为空格跳出循环,p指向的就是空格,所以p - 1
reverse(start,p - 1);
if (*p != '\0')
{
p++;
}
}
return 0;
}
第四步:输出数组a
【完整代码】
#include <stdio.h>
#include <string.h>
void reverse(char* left, char* right)
{
//当left < right说明还有元素可以交换
while(left < right)
{
char tmp = *left;
*left = *right;
*right = tmp;
left ++;
right--;
}
}
int main()
{
char arr[101];
//输入
gets(arr);
//逆序整个字符串
int sz = strlen(arr); //求字符串长度
reverse(arr,arr + sz - 1);
//逆序每一个单词
char* p = arr;
while(*p)
{
char* start = p;
while(*p != ' ' && *p != '\0')
{
p++;
}
reverse(start,p - 1);
if (*p != '\0')
{
p++;
}
}
//输出数组a
printf("%s\n",arr);
return 0;
}
最后这题也是完美AC啦!
总结:这题难点在于如何逆序单词。
2023年1月16日