【笔试题】倒置字符串—巧用cin输入流

【笔试题】 倒置字符串—巧用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’说明源字符串完全遍历,将查找到的单词进行全转置,即可。整个思路在下面的简图列出。

DwdbxP.png

  点击练习:倒置字符串


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>>的巧用之处。

Dwsmgs.png

  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;
}

猜你喜欢

转载自blog.csdn.net/Sunnyside_/article/details/110148991