【笔试题】 倒置字符串—巧用cin输入流
1、题目描述
将一句话的单词进行倒置,标点不倒置。比如 I like beijing. 经过函数后变为:beijing. like I
2、输入描述
每个测试输入包含1个测试用例: I like beijing. 输入用例长度不超过100
3、输出描述
依次输出倒置之后的字符串,以空格分割
4、示例
输入:I like beijing.
输出:beijing. like I
5、分析
将一句话的单词进行倒置,首先想到的是全转置,然后在全转置的字符串中查找空格或者\0, 遇到空格说明找到了一个单词,遇到’\0’说明源字符串完全遍历,将查找到的单词进行全转置,即可。整个思路在下面的简图列出。
点击练习:倒置字符串
6、代码
//C语言实现
#include<stdio.h>
#include<string.h>
//转置字符串
void Reverse_String(char *s, int start, int leng)
{
char temp = 0;
while (start<leng)
{
temp = s[start];
s[start] = s[leng];
s[leng] = temp;
start++;
leng--;
}
}
//转置单词
void Reverse_Word(char *s)
{
int start, leng, end;
start = 0;
end = 0;
leng = strlen(s);
// 1、将字符串完全转置
Reverse_String(s, start, leng - 1);
// 2、查询单词,进行单词转置
while (s[end] != '\0') //若访问到\0处代表字符串已访问完
{
while (s[end] != ' ' && s[end] != '\0')
//用end去查找单词之间的空格或者\0,一旦找到end停止++
{
end++;
}
Reverse_String(s, start, end - 1);
//将查询到的该单词进行转置
start = end + 1; //start跳至end+1的位置,开始查询下一个单词
end++; //end自加
}
}
void main()
{
char S[100] = {
0 };
printf("请输入要转置的单词\n");
gets(S);
Reverse_Word(S);
printf("%s", S);
}
7、C++实现
7.1 巧用cin输入流
C语言实现起来比较复杂,但是思路是最容易想到的,不妨思考C++中的cin>>的巧用之处。
扫描二维码关注公众号,回复:
13110803 查看本文章
cin与cout分别是istream和ostream模板类的对象,cin是从缓冲区读取数据的,用cin输入的数据会先保存到缓冲区中,刷新缓冲区的方法有多种方法。
在C++中,cin>>str这种方法接收的字符串不能包含空格,否则它会按照空格将整个字符串切分成若干段。如果要是想输入带空格的字符串那就要用到getline()函数。
我们巧用cin会按照空格将整个字符串分隔成若干段和cin函数录入的str后面不能包含空格这两个特性,将每个单词头插至最前面,实现倒序单词。这样的好处是每个单词内的字母无需改变顺序,降低了时间复杂度。整个思路在下面的简图列出。
7.2 C++实现倒置字符串
//C++实现
#include<iostream>
#include<string>
using namespace std;
int main()
{
string str1,str2;
cin>>str1;
while(cin>>str2)
{
str1.insert(0," ");
str1.insert(0,str2);
}
cout<<str1<<endl;
return 0;
}