首页 > 试题广场 > 句子逆序
[编程题]句子逆序

将一个英文语句以单词为单位逆序排放。例如“I am a boy”,逆序排放后为“boy a am I”
所有单词之间用一个空格隔开,语句中除了英文字母外,不再包含其他字符


接口说明

/**
 * 反转句子
 * 
 * @param sentence 原句子
 * @return 反转后的句子
 */
public String reverse(String sentence);

 

 

 


输入描述:

将一个英文语句以单词为单位逆序排放。



输出描述:

得到逆序的句子

示例1

输入

I am a boy

输出

boy a am I
#include<iostream>
#include<vector>
using namespace std;
int main(){
	string s;
    vector<string> vs;
    while(cin >> s)
        vs.push_back(s);
    for(int i = vs.size()-1; i > 0; --i)
        cout << vs[i] << " ";
    cout << vs[0] << endl;
    return 0;
}

发表于 2017-03-23 15:50:50 回复(21)
print(" ".join(input().split()[::-1]))

python3一行暴力解法。

发表于 2017-09-06 11:09:35 回复(13)
#include <iostream>
#include <string>
#include <sstream>
using namespace std;

int main() {
	string s;
	getline(cin,s);
	stringstream ss(s);
	string res="", tmp;
	while (ss>>tmp) {
		if (res=="")
			res=tmp;
		else
			res=tmp+" "+res;
	}
	cout<<res;
	return 0;
}
用c++的stringstream很简单
发表于 2015-12-22 17:49:01 回复(9)
#include<iostream>
#include<stack>
#include<string>
using namespace std;
int main()
{
    stack<string> ss;
    string s;
    while(cin>>s)
    {
        ss.push(s);
    }
    while(!ss.empty())
    {
        cout<<ss.top();
        ss.pop();
        if(!ss.empty())
            cout<<' ';
    }
    cout<<endl;
}

发表于 2016-03-23 18:11:55 回复(35)
#include<stdio.h>
#include<string.h>
int main()
{
    char s[1024];
	while( gets(s)){
    int len=strlen(s),i,j,k;
        for(i=len-1;i>=0;i--)
		{
            if(s[i-1]==' ')
            {   k=len;
			   
                for(j=i;j<k;j++)
                    {
					printf("%c",s[j]);
				}
                i--;
				len=i;
					printf(" ");
            }
			if(i==0)
			{
				for(j=0;j<len;j++)
				{printf("%c",s[j]);}
			}
    }		
}
}


发表于 2016-09-07 21:25:24 回复(2)
#include <stdio.h>
#include <string.h>
int main(){   
    char str[1000];
    char *p;
    gets(str);
    while(p=strrchr(str,' ')){
        printf("%s ",p+1);
        *p='\0';
    }
    printf("%s",str);
    return 0;
}

发表于 2016-05-01 16:01:12 回复(15)
//两种方法:
//方法一:逆序扫描,保存每个单词,遇到空格就输出前面的单词
#include<iostream>
#include<string>
using namespace std;
int main(){
    string s;
    while(getline(cin,s)){
        int n=s.size();
        string tmp;
        for(int i=n-1;i>=0;i--){
            if(s[i]!=' ')
                tmp=s[i]+tmp;
            else{   
                cout<<tmp;
                cout<<' ';
                tmp.clear();
            }  
        } 
        cout<<tmp<<endl;
    } 
}
//方法二:用reverse,先整体反转再局部反转
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
int main(){
    string s;
    while(getline(cin,s)){
        reverse(s.begin(),s.end());
        string::iterator left=s.begin();
        for(string::iterator itr=s.begin();itr!=s.end()+1;++itr){
             if(itr==s.end()||*itr==' '){
                 reverse(left,itr);
                 left=itr+1;
             }      
        }
        cout<<s<<endl;
    }
}

发表于 2017-05-25 16:14:35 回复(8)
//写了个具有普适意义的代码
//本题中的空格只是我的一个特例
#include <iostream>
#include <vector>
#include <string>

using namespace std;

//字符串分割函数 str为待分割的字符串 pattern为任意分割符
vector<string> split(string str, string pattern)
{
	vector<string> ret;
	if (pattern.empty()) return ret;

	int start = 0, index = str.find_first_of(pattern, 0);
	while (index != string::npos)
	{
		if (start != index)
			ret.push_back(str.substr(start, index - start));
		start = index + 1;
		index = str.find_first_of(pattern, start);
	}

	if (!str.substr(start).empty())
		ret.push_back(str.substr(start));
	return ret;
}

int main()
{
	string str;
	getline(cin, str);
	string pattern = " ";

	vector<string> result = split(str, pattern);
	for (int i = result.size()-1; i>0; i--)
	{
		cout << result[i] << " ";
	}
	cout << result[0];
	
	//system("pause");
	return 0;
}
发表于 2016-05-13 19:52:04 回复(1)
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        while(in.hasNext()) {
            String s = in.nextLine();
            String reverse = new Main().reverse(s);
            System.out.println(reverse);
        }
    }
    
    
    public String reverse(String sentence) {
        String[] arr = sentence.split(" ");
        StringBuilder sb = new StringBuilder();
        for(int i=arr.length-1; i>=0; i--) {
            sb.append(arr[i] + " ");
        }
        return sb.toString().trim();
    }
}
发表于 2016-03-23 20:42:44 回复(6)
import java.util.Scanner;

/**
 * i am a boy=>boy a am i
 * @author Administrator
 *
 */
public class Main14 {

	public static void main(String[] args) {
		
		Scanner sc = new Scanner(System.in);
		while (sc.hasNext()) {
			String str = sc.nextLine();
			int len = str.length();
			String[] s=str.split(" ");
			StringBuilder sb = new StringBuilder();
			for (int i = s.length-1; i >=0; i--) {
				sb.append(s[i]+" ");
			}
			
			System.out.println(sb.substring(0, len));
	}
	}
}


发表于 2016-05-27 22:46:42 回复(9)
import java.util.*;
public class Main {
	public static void main(String[] args) {
		Scanner cin = new Scanner(System.in);
		while (cin.hasNextLine()) {
			String str = cin.nextLine();
            System.out.println(reverse(str));
		}
	}
    public static String reverse(String s ){
        String str = "" ,result = "";
        // 从后往前扫描,遇到空格就处理一个单词。
        for(int i=s.length()-1;i>=0; i--){
            if(s.charAt(i)!=' ')
                str+=s.charAt(i);
            else{
                for(int j=str.length()-1 ; j>=0 ;j--)
                    result+=str.charAt(j);
                result+=" ";
                str="";
            }
        }
        //再把最后一个单词追加到结果串上。
        for(int j=str.length()-1 ; j>=0 ;j--)
             result+=str.charAt(j);
        return result;
    }
}

发表于 2016-04-26 01:00:50 回复(0)
#Python代码
print(' '.join((input().split())[::-1]))

发表于 2018-07-26 09:56:40 回复(1)
import java.util.Scanner;

public class SentenceBackward {

	public static void main(String[] args) {
		Scanner sc= new Scanner(System.in);
		String a=sc.nextLine();
		String []str =a.split(" ");
		for(int i=str.length-1;i>0;i--)
			System.out.print(str[i]+" ");
		System.out.print(str[0]);
	}
}
用split分割字符串后逆序输出。

发表于 2017-04-17 20:53:12 回复(3)
//#include "stdafx.h"
#include<iostream>
#include<string>
#include<vector>
using namespace std;
int main()
{
   string str;
   vector<string>moban;
   while(cin>>str)
   {
 moban.push_back(str);
   }
   for(int i=moban.size()-1;i>0;i--)
  cout<<moban[i]<<" ";
    cout<<moban[0];
   return 0;
}

发表于 2016-06-19 09:34:30 回复(0)
本题的方法很多,其中的一种是利用指针。输入的句子中包含许多单词,我们要对单词的顺序进行逆序排列,但是不能打乱单词本身的次序,所以在处理的时候我们应该将每一个单词作为一个整体来处理,可以先将句子中的所有单词提取出来依次放在一个字符串数组中,最后再逆序输出就可以得到结果了,提取单词的时候可以使用一种非常常用的C++的字符串内取子串函数substr函数,具体代码如下:
#include<iostream>
#include<string>
int Word_Len(char *p);
using namespace std;
int main()
{
	string Input_String,Output_String[1000];
	int i=0,index=0,length;
	getline(cin,Input_String);
	char *p=&Input_String[0];
	while(*p!='\0')
	{
		if(*p==' ')
		{
			index++;
			p++;
			continue;
		}
		length=Word_Len(p);
		Output_String[i++]=Input_String.substr(index,length);
		p+=length; 
		index+=length;
	}
	for(int k=i-1;k>0;k--)
		cout<<Output_String[k]<<" ";
	cout<<Output_String[0]<<endl;
	return 0;
}
int Word_Len(char *p)
{
	int len=0;
	while(*p!=' '&&*p!='\0')
	{
		len++;
		p++;
	}
	return len;
}

编辑于 2016-03-14 20:38:57 回复(0)
//两次翻转:先整体翻转,然后再每个单词翻转。
//时间O(n),空间O(1)
#include<iostream>
#include<algorithm>
using namespace std;

int main(){   
    string str;
    while(getline(cin,str)){        
		reverse(str.begin(), str.end());
        str += ' '; //补上个' '
        string::size_type s = 0, e = -1;
        string::iterator it = str.begin();
        while((e = str.find(' ', e+1)) != string::npos){
			reverse(it+s, it+e);
            s = e+1;
        }
		str.erase(str.end()-1); //删除补上的那个' '
        cout<<str<<endl;
    }
    return 0;
}

发表于 2017-05-25 15:51:39 回复(1)
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        
        Scanner in = new Scanner(System.in);
        
        while (in.hasNextLine()) {
            String str = in.nextLine();
            String[] sentences = str.split(" ");
            for (int i = sentences.length - 1; i >= 0; i--) {
                if (i==0) {
                    System.out.print(sentences[i]);
                    break;
                }
                System.out.print(sentences[i]+" ");
            }
        }
        
    }
    
}

发表于 2016-08-10 17:34:09 回复(0)
data=raw_input("").split()
data.reverse()
str=""
for i in range(len(data)):
    if(i<len(data)-1):
        str=str+data[i]+" "
    else:
        str+=data[i]
print str
下面是C++写的代码
#include<iostream>
#include<string>
#include<stack>
using namespace std;
int main()
{
	string str;
	stack<string>ss;
	getline(cin, str);
	//cout << str << endl;
	int len = str.length();
	string str1 = "";
	for (int i = 0; i < len; i++)
	{
		if (str[i] == ' ')
		{
			if (i + 1 < len&&str[i + 1] != ' ')
			{
				ss.push(str1);
				str1 = "";
			}
		}
		if (i == len - 1 && str1.length() != 0)
		{
			if (str[i] != ' ')
			{
				str1 += str[i];
			}
			ss.push(str1);
		}
		else
		{
			if (str[i] != ' ')
			{
				str1 += str[i];
			}
		}

	}
	while (!ss.empty())
	{
		cout << ss.top();
		ss.pop();
		if (!ss.empty())
		{
			cout << " ";
		}
	}
	//system("pause");
	return 0;
}
这段代码处理比较全,多个空格也没问题的,前面后面随意加空格也是没问题的哈

编辑于 2016-07-03 23:05:31 回复(0)
import java.util.*;
public class Main {
    public static void main(String args[]){
        Scanner cin=new Scanner(System.in);
        while(cin.hasNext()){
            String s=cin.nextLine();
            String[] array=s.split("[^a-zA-Z]");
            List<String> list= Arrays.asList(array);
            Collections.reverse(list);
            for(String each:list.subList(0,list.size()-1)){
                System.out.print(each+" ");
            }
            System.out.println(list.get(list.size()-1));
        }
    }
}

发表于 2016-03-27 20:47:10 回复(0)
#include <iostream>
#include <string>
#include <stack>
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;
}

发表于 2016-07-13 16:42:36 回复(0)