首页 > 试题广场 >

句子反转

[编程题]句子反转
  • 热度指数:64190 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解
给定一个句子(只包含字母和空格), 将句子中的单词位置反转,单词用空格分割, 单词之间只有一个空格,前后没有空格。 比如: (1) “hello xiao mi”-> “mi xiao hello”

输入描述:
输入数据有多组,每组占一行,包含一个句子(句子长度小于1000个字符)


输出描述:
对于每个测试示例,要求输出句子中单词反转后形成的句子
示例1

输入

hello xiao mi

输出

mi xiao hello
#include<iostream>
#include<stack>
#include<string>
using namespace std;
int main(){
    string s;
    stack<string> sstack;
    while(cin>>s){
        sstack.push(s);
    }
    while(sstack.size()!=1){
        cout<<sstack.top()<<" ";
        sstack.pop();
    }
    cout<<sstack.top()<<endl;
    return 0;
}

发表于 2017-08-10 23:12:38 回复(13)
import java.util.Scanner;

public class StringUtil {

	//句子反转
	public static void main(String[] args) {
		Scanner in = new Scanner(System.in);
		while(in.hasNext()){
			String str = in.nextLine();
			String arr[] = str.split(" ");
			StringBuffer res = new StringBuffer();
			for(int i=arr.length-1; i>0; i--){
				res.append(arr[i]+" ");
			}
			res.append(arr[0]);
			System.out.println(res.toString());
		}
	}
}

发表于 2017-09-04 16:04:36 回复(6)
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;

int main() {
    string words;
    while (getline(cin, words)) {
        reverse(words.begin(), words.end());
        unsigned i = 0, j = i;
        while (i < words.size()) {
            while (i < words.size() && words[i] != ' ')
                ++i;
            reverse(words.begin() + j, words.begin() + i);
            j = ++i;
        }
        cout << words << endl;
    }
    return 0;
}

编辑于 2017-12-23 10:04:48 回复(1)
#include <iostream> 
#include <stack>
#include <string>

using namespace std;

int main()
{     string s;     stack<string> st;     while(cin>>s)          st.push(s);     while(st.size()!=1)     {         cout<<st.top()<<" ";         st.pop();     }     cout<<st.top()<<endl;     return 0;
}

发表于 2018-01-10 00:27:58 回复(0)
其实这道题应该再加一个空间复杂度为O(1)的要求
/**
*1.先将整个字符串转成字符数组反转得到 mi xiao hello
*2.遍历这个字符数组,遇到空格或者到了尾部再做局部反转
*/
public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		String s = scanner.nextLine();
		char[] arr = s.toCharArray();
		for (int i=0; i<arr.length/2; i++) {	// 整体反转
			char temp = arr[i];
			arr[i] = arr[arr.length-1-i];
			arr[arr.length-1-i] = temp;
		}
//		System.out.println(new String(arr));
		int start = 0, end = 0;
		for (int i=0; i<arr.length; i++) {		// 局部反转
			if (arr[i]==' ' || i+1==arr.length) {
				if (arr[i]==' ')
					end = i-1;
				else if (i+1==arr.length)
					end = i;
				for (int j=start; j<(start+end+1)/2; j++) {
					char temp = arr[j];
					arr[j] = arr[start+end-j];
					arr[start+end-j] = temp;
				}
				start = i + 1;
			}
		}
		System.out.println(new String(arr));
	}

发表于 2017-09-11 16:20:10 回复(2)
//首先将输入字符串整体逆序,然后再分别逆序每个单词,单词以空格为边界。
//需要注意的是最后一个单词也要逆序,可以最后单独处理。
#include<iostream>
#include<string>
using namespace std;

void Reverse(string &str, int start, int end)    //字符串整体逆序
{
	while (start < end)
	{
		swap(str[start], str[end]);
		start++;
		end--;
	}
}

int main()
{
	string str;
	while (getline(cin,str))
	{
		int len = str.length();
		if (len <= 1)
		  {
			cout << str << endl;
			continue;
		  }
		Reverse(str,0,len-1);   //字符串整体逆序,比如输入"hello xiao mi",逆序后变为"im oaix olleh"
		int index = 0;    //记录每个单词第一个字母的位置index,初始为0
		for (int i = 0; i < len; i++)
		{
			if (str[i] == ' ')   //找到第一个空格
			{
				Reverse(str, index, i - 1);    //将str中index到i-1位置之间的单词逆序,此时im变为mi
				index = i + 1;   //记录下一个待逆序单词的起始位置
			}
		}
		Reverse(str, index, len-1);   //处理最后一个单词
		cout << str << endl;
	}
}

发表于 2017-09-06 16:38:58 回复(1)
import java.util.Scanner;
public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        while(scanner.hasNext()){
            String str = scanner.nextLine();
            String[] strs = str.split(" ");
            for (int i = strs.length-1; i >= 0; i--) {
                System.out.print(strs[i]);
                if(i != 0){
                    System.out.print(" ");
                }
            }
        }
    }
}

编辑于 2018-10-22 19:51:21 回复(2)
C语言思路:
第1步:先将整个字符串逆置。
第2步:再将单词逆置
整个代码多次用到逆置,故设计成函数
代码如下:
#include<stdio.h>
#include<string.h>
int main()
{
    char a[1001];
    int i,j;
    gets(a);
    int l=strlen(a);
    void reverse(char *str,size_t len);
    void print(char *str,size_t len);
    reverse(a,l);              //整个字符串逆置
    for(i=0,j=i;j<l+1;j++)  //单词逆置
        {
            if(a[j]==' ')
            {
                reverse(a+i,j-i);
                print(a+i,j-i);
                printf(" ");
                i=j+1;
            }
            if(a[j]=='\0')
            {
                reverse(a+i,j-i);
                print(a+i,j-i);
                break;
            }
        }
    return 0;
}
    /****************逆置函数********************/
    void reverse(char *str,size_t len)
    {
        if(str==NULL||*str=='\0'||len==0||len==1)
            return;

        char *p1,*p2,t;
        p1=str;
        p2=str+len-1;
        while(p1<p2)
        {
            t=*p1;
            *p1=*p2;
            *p2=t;
            p1++;
            p2--;
        }  
    }
    /*******************输出函数******************/
    void print(char *str,size_t len)
    {
      int i;
      for(i=0;i<=len-1;i++)
        {
           printf("%c",*str);
           str++;
        }
    }
发表于 2018-02-24 14:32:52 回复(1)
#include <iostream>
#include <string>
#include <vector>
using namespace std;

int main()
{
    string str1, temp;
    vector<string> v1;
    getline(cin, str1);
    for (int i = 0;i < str1.size();++i)
    {
        if (str1[i] != ' ')
            temp += str1[i];
        else
        {
            if (!temp.empty())
            {
                v1.push_back(temp);
                temp.clear();
            }
        }
    }
    if (!temp.empty())
        v1.push_back(temp);
    int i;
    for (i = v1.size() - 1;i > 0;--i)
        cout << v1[i] << ' ';
    cout << v1[i] << endl;
    return 0;
}

发表于 2017-09-26 21:03:09 回复(0)
//本例题,用python 和用java都有分隔函数,不过不知道c++有没有。所以用C++代码比较复杂一点
时间复杂度是O(n2),从后面像前面递归,遇见空格先后面输出再遇见空格或到最后一个字母停止(没有这个的话会一直输出到你定义的数组长度末)
最后如果遇见的是第一个字符同上,向后输出,遇见空格或最后一个字母停止
最后希望我们共同坚持,特别是我
#include<iostream>
#include<cstring>
#include<algorithm>
#define N 1001
using namespace std;
int main()
    {
     char a[N];
     while(gets(a)){
      //cout<<strlen(a)<<endl;
      for(int i = strlen(a)-1;i>=0;i--)
      {
      if(a[i]==' ')
      {
      for(int j = i+1;j<strlen(a);j++)
      {
      if(a[j]==' ')break;
      else cout<<a[j];
 } 
 cout<<" ";
}
else if(i==0){
for(int j = i;;j++)
      {
      if(a[j]==' ')break;
      else cout<<a[j];
 cout<<endl;
}
}
}
    return 0;
}
发表于 2017-08-14 15:01:05 回复(2)
#include<stdio.h>
#include<string.h>

int main()
{
    int n,i=0,j,k;
    char s[1001],t[1001],c,temp;
    for(i=0;(c=getchar())!='\n';)
    {
        s[i++]=c;
    }
    s[i]='\0';
    i--;
    for(;i>=0;)//从句子尾部开始,遇到空格则抽离一个单词,得到的单词是倒序的,再通过一次反转
    {
        for(j=0;(s[i]!=' ')&&(i>=0);j++,i--)
        t[j]=s[i];
        t[j]='\0';
        j--;
        for(k=0;k<j;k++,j--)
        {
            temp=t[j];
            t[j]=t[k];
            t[k]=temp;
        }
        printf("%s",t);
        if(i<0) break;
        else {
                i--;
        printf(" ");}
    }
    printf("\n");
    return 0;
}

发表于 2018-01-09 16:25:56 回复(1)
//...直接转换成数组翻转再连接成字符串
while(line = readline()){
    var lines = line.split(' ');
    var str = lines.reverse().join(' ');
    print(str);
}

发表于 2017-08-08 10:11:00 回复(0)
#include <iostream>
#include <string>
using namespace std;

int main(){
    string tmp,res; res="";
    while(cin>>tmp){res=tmp+" "+res;}
    cout<<res.substr(0,res.size()-1);
    return 0;
}

发表于 2018-04-13 15:22:34 回复(0)

import java.util.Scanner;
public class Main{
 public static void main(String[] args) {
     String[] nextLine = new Scanner(System.in).nextLine().split(" ");
        StringBuilder stringBuilder = new StringBuilder();
        for (int i = nextLine.length-1; i >= 0; i--) {
            if (i==0) {
          stringBuilder.append(nextLine[i]);
   }else{
                stringBuilder.append(nextLine[i]+" ");
            }
      }
        System.out.println(stringBuilder);
     }
}

发表于 2020-08-21 12:13:38 回复(0)
创建一个string类型的vector, 将每个单词都push_back进去。然后再将vector中每个元素反向输出即可。

#include<iostream>
#include <string>
#include<vector>
using namespace std;

int main()
{     vector<string>a;     string temp;     char b;     while((cin>>temp).get(b)){         a.push_back(temp);         if(b=='\n')             break;     }     for(int i = 0;i<a.size();i++){         cout<<a[a.size()-1-i];         if(i!=a.size()-1)             cout<<" ";     }     system("pause");     return 0;
}

编辑于 2019-03-25 16:26:17 回复(0)

Python nice!

a = input().split()
a.reverse()
print(" ".join(a))

发表于 2018-12-04 11:04:46 回复(0)
#include<iostream>
#include<vector>
#include<algorithm>
#include<string>
using namespace std;
int main()
{
    vector<string> v;
    string s;
    while(cin>>s)
    {
        v.push_back(s);
    }
    reverse(v.begin(),v.end());
    int m = v.size();
    for(int i = 0;i < m-1;i++)
    {
        cout<<v[i]<<" ";
    }
    cout<<v[m-1];//保证输出格式
    
    return 0;
}
发表于 2018-11-20 16:42:49 回复(0)
#include<iostream>
#include<string>
#include<sstream>

using namespace std;

int main()
{
    string line, result, word;
    while (getline(cin, line))
    {
        istringstream ism(line);
        ism >> result;
        while (ism >> word)
            result = word + " " + result;
        cout << result;
    }
    return 0;
}

发表于 2018-11-02 09:52:45 回复(0)
import java.io.BufferedReader;
import java.io.InputStreamReader;
public class Main{
    public String Opposite(String str){
        String[] str1=str.split(" ");
        String result="";
        for(int i=0;i<str1.length;i++){
           if(i==0){
                result=result+str1[i];
                 }else{
                result=str1[i]+" "+result;
            }
    }
    return result;
}
    public static void main(String[] args) throws Exception{
        BufferedReader bf=new BufferedReader(new InputStreamReader(System.in));
        String s=bf.readLine();
        System.out.println(new Main().Opposite(s));
    }
}
发表于 2018-10-11 11:40:11 回复(0)
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String line = br.readLine();
        String[] split = line.split(" ");
        String[] arrRe = new String[split.length];
        for (int i = split.length - 1; i >= 0; i--) {
            arrRe[split.length - i - 1] = split[i];
        }
        String str = "";
        for (String s : arrRe) {
            str += s+" ";
        }
        System.out.println(str.substring(0,str.length()-1));
    }
}
发表于 2018-09-11 12:51:22 回复(0)