1.描述

将一句话的单词进行倒置,标点不倒置。比如 I like beijing. 经过函数后变为:beijing. like I

输入描述:

每个测试输入包含1个测试用例: I like beijing. 输入用例长度不超过100

输出描述:

依次输出倒置之后的字符串,以空格分割

2.牛客网链接

​https://www.nowcoder.com/practice/ee5de2e7c45a46a090c1ced2fdc62355​

3.思路

将一个单词进行倒置,第一步先把整个字符串进行倒置,然后再对每一个单词进行倒置,废话不多说开始叭


逆序整个字符串:

首先定义char arr[100]={0};

输入 gets(arr)//这里进行介绍一下gets函数,它是进行字符串输入的,而且还能进 行空格的读取,但是用法有点怪,在微软软件里(包括VS2019)进行输入的时候 要用gets_s,但是在牛客网上的时候,直接用gest

int len=strlen(arr);

定义函数reverse(arr,arr+len-1);

函数内容

倒置字符串_逆序

逆序每个单词:

首先进行定义char*cur=arr;char*start=cur;

单词一旦遇到空格,表示一个单词的结束,从此下手

while(*cur!=‘ ’)

{

cur++

}

当while停下来的时候cur指向空格,而cur前一个位置就是单词的结束的位置例如(hello

这是一个单词的逆序,要进行多个的,再定一个表示开始,再调用reverse函数,传递两个参数,

第一个参数为start,第二个参数为cur-1.着就表示把一个单词逆序过去了,例如(hello world)

要跳要个空格,到下一个单词cur指向的是空格

cur++;

逃过去的时候,cur再赋值给start,此时就是一个循环了

倒置字符串_逆序_02

假设还是(hello world)单词的结束并不是空格,第二个单词是以\0,结束

所以判断内容为(*cur!=' '&&*cur!='\0'),只要在这循环中遇到空格或者\0

就会结束​   而大循环的循环内容为(*cur)

但是还是有问题的,当我们以\0为结束的时候cur++程序会进入死循环

在cur++;前面进行判断if(*cur!='\0')

倒置字符串_逆序_03

4.整个程序

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
#include <assert.h>
void reverse(char*left,char*right)
{
assert(left && right);
while (left < right)
{
char tmp = *left;
*left = *right;
*right = tmp;
left++;
right--;
}
}
int main()
{
char arr[100] = { 0 };
//输入
gets_s(arr);
int len = strlen(arr);
//完成这个逆序
//1.逆序字符串
reverse(arr,arr+len-1);
//逆序每个单词
char* cur = arr;
while (*cur)
{
char* start = cur;
while (*cur != ' ' && *cur != '\0')
{
cur++;
}
reverse(start, cur - 1);
if (*cur != '\0')
cur++;
}
//打印
puts(arr);
return 0;
}

代码结果:

倒置字符串_逆序_04

5.注意

该程序是在VS2019 中运行的结果,要是在牛客网上要把gets_s改为gets.

6.感想

对于题目要分析正确,首先是对整个求逆序,其次在对每个单词求逆序,还需要多多练习,

并熟练掌握。