首页 > 试题广场 >

英文句子单词翻转

[编程题]英文句子单词翻转
  • 热度指数:1781 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解
原地翻转句子中单词的顺序,但单词内字符的顺序不变。要求:空间复杂度O(1),时间复杂度O(n)。

输入描述:
英文句子中单词以一个空格符隔开。为简单起见,标点符号和普通字母一样处理。


输出描述:
翻转之后的英文句子,单词内字符的顺序不变,以一个空格隔开。
示例1

输入

I am a student.

输出

student. a am I
//参考《剑指offter》第48题,翻转字符串
//时间复杂度O(n),空间复杂度O(1)

#include<iostream>
(720)#include<string>
using namespace std;
void Reverse(string &s, int left, int right)
{
	if (s.empty())
		return;
	while (left<right)
	{
		char temp = s[left];
		s[left] = s[right];
		s[right] = temp;
		left++, right--;
	}
}
void ReverseSentence(string &s)
{
	if (s.empty())
		return;

	int left = 0, right = s.size() - 1;

	//反转整个句子
	Reverse(s, left, right);


	//翻转句子中的每个单词
	left = right = 0;
	while (left<s.size())
	{
		if (s[left] == ' ')
		{
			left++;
			right++;
		}
		else if (s[right] == ' ' || right == s.size())
		{
			Reverse(s, left, --right);
			left = ++right;
		}
		else {
			right++;
		}
	}
}
int main()
{
	string s;
	getline(cin, s);
	ReverseSentence(s);
	cout << s;
}

发表于 2020-02-29 18:22:43 回复(0)
#include<iostream>
#include<vector>
#include<string>
using namespace std;
int main(){
    vector<string> store;
    string in;
    while(cin>>in)  store.push_back(in);
    for(auto c=store.end();c!=store.begin();)
        cout<<*(--c)<<' ';
    return 0;
}
vector是c++里最美好的一个发明。
编辑于 2020-05-06 16:38:37 回复(1)
这道题关键是切分数组,可以利用java里面String的split方法切分成一个数组,然后把数组倒过来遍历,当然也可以自己写一个方法切分数组,不难,只需要用charAt()得到数组每一个字符然后用StringBuffer拼接成一个字符串,放进数组里面,遇到空格就跳过即可
import java.util.Scanner;
public class Main {
 
    public static String reserve(String str){
        String[] ss = str.split(" ");
        StringBuffer s = new StringBuffer("");
        for(int i = ss.length-1; i>=0;i--){
            s.append(ss[i]+" ");
        }
        return s.toString();
    }
 
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        String str = in.nextLine();
        String reserve = reserve(str);
        System.out.println(reserve);
    }
 
}


发表于 2019-12-05 20:49:26 回复(1)
我真的很服在这里写String.split的各位大哥,题目里面空间复杂度O(1)看不到么?
发表于 2020-08-12 21:04:15 回复(5)

import java.util.*;

public class EnglishWords {

	public static void main(String[] args) {
		
		Scanner sc = new Scanner(System.in);
		String str = sc.nextLine();
		String[] strs = str.split(" ");
		for(int i=strs.length-1;i>0;i--) {
			System.out.print(strs[i]+" ");
		}
		System.out.println(strs[0]);
	}

}

发表于 2020-08-10 00:47:32 回复(0)
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
 
/*
原地翻转句子中单词的顺序,但单词内字符的顺序不变。要求:空间复杂度O(1),时间复杂度O(n)。
I am a student.
 */
public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
        String[] s=br.readLine().split(" ");
        for(int i=s.length-1;i>=0;i--){
            System.out.print(s[i]+" ");
        }
    }
}

发表于 2021-04-23 22:09:08 回复(0)
#include <iostream>
#include <vector>
#include <queue>
#include <stack>
#include <cstring>
#include <cstdio>
#include <cstdlib>
#include <set>
#include <map>
#include <cmath>
#include <list>
#include <algorithm>
#include <string>
using namespace std;
void ***this()
{
    char s[50];
    if(cin>>s){
        ***this();
        cout<<s<<" ";
    }else return;
}
int main()
{
    ***this();
    return 0;
}

发表于 2021-04-22 02:52:25 回复(0)
import java.util.*;
public class Main {
    // 将字符串转为 charArray
    public static void main(String args[]) {
        Scanner in = new Scanner(System.in);
        String[] arr = in.nextLine().split(" ");
        String res = "";
        for(int i = arr.length-1; i >=0 ; i--) {
            res += arr[i];
            if(i != 0) {
                res += " ";
            }
        }
        System.out.println(res);
    }
}

投机取巧的方法竟然也过了, 空间不是 O(1)
发表于 2020-09-04 15:43:43 回复(0)
line = input().split()
out = []
for i in line:
    out.insert(0, i)
print(' '.join(out))
发表于 2020-09-04 13:24:58 回复(0)
复杂度不符合要求。
#include<bits/stdc++.h>
using namespace std;


int main()
{
    string s;
    while(getline(cin,s))
    {
        int st=s.size()-1;
        string ans;
        while(st>=0)
        {
            int pos=s.rfind(' ',st);
            if(pos==string::npos)
            {
                ans+=s.substr(pos+1,st-pos);
                break;
            }
            else
            {
                ans+=s.substr(pos+1,st-pos);
                ans+=" ";
                st=pos-1;
            }
        }
        cout<<ans<<endl;
    }
    return 0;
}
再来个原地调整顺序的吧!参考于剑指offer
#include<bits/stdc++.h>
using namespace std;

void reverseStr(string &s,int l,int r)
{
    while(l<r)
    {
        swap(s[l],s[r]);
        l++,r--;
    }
}

int main()
{
    string s;
    while(getline(cin,s))
    {
        int l=0,r=s.size()-1;
        reverseStr(s,0,r);
        int i=0,j=0;
        while(j<=s.size())
        {
            if(j<s.size() && s[j]!=' ')
                j++;   
             else if(j==s.size() || s[j]==' ')
             {
                 reverseStr(s,i,j-1);
                 i=j+1;
                 j++;
             } 
        }
        cout<<s<<endl;
    }
    return 0;
}




编辑于 2020-09-03 19:46:42 回复(0)
import java.util.*;
public class Main{
    public static void main(String[] args){
        Scanner input = new Scanner(System.in);
        String str = input.nextLine();
        String[] x = str.split(" ");
        for(int i = x.length;i>1;i--){
            System.out.print(x[i-1]+" ");
        }
        System.out.println(x[0]);
    }
}
split万岁!
发表于 2020-07-21 20:14:10 回复(0)
import java.util.Scanner;
 
public class Main{
     
    public static void main(String[] args){
        Scanner s = new Scanner(System.in);
        String[] str = s.nextLine().split(" ");
        for(int i =0;i <str.length/2;i++){
            String temp = str[i];
            str[i]=str[str.length-i-1];
            str[str.length-i-1]=temp;
        }
        for(int i =0;i <str.length;i++){
            System.out.print(str[i]+" ");        
        }
         
         
    }
     
     
}

发表于 2020-07-16 17:37:48 回复(0)
依次翻转句子中的每个单词,最后整体翻转。
import java.util.*;
public class Main{
     
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        String s = sc.nextLine();
        System.out.println(reverseSetence(s));
         
    }
     
    public static String reverseSetence(String s){
         
        if(s.length() <= 1) return s;
        char[] chars = s.toCharArray();
        int index = 0;
        for (int i = 0; i < chars.length; i++){
            if(chars[i] == ' '){
                reverse(chars,index,i - 1);
                index = i + 1;
            }
            if(i == chars.length - 1)
                reverse(chars,index,chars.length - 1);
        }
        reverse(chars,0,chars.length - 1);
        return new String(chars);
    }
    // 翻转单个单词
    public static void reverse(char[] chars, int low, int high){
         
        while(low < high){
            char temp = chars[low];
            chars[low] = chars[high];
            chars[high] = temp;
            ++low;
            --high;
        }
    }
}


发表于 2020-04-12 20:04:42 回复(0)
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        StringBuilder input = new StringBuilder(scanner.nextLine());
        input = input.reverse().append(" ");
        int start = 0;
        for (int i = 0; i < input.length(); i++) {
            if (input.charAt(i) == ' ') {
                for (int j = start, k = 0; k < (i - j) / 2; k++) {
                    char c = input.charAt(j + k);
                    input.setCharAt(j + k, input.charAt(i - k - 1));
                    input.setCharAt(i - k - 1, c);
                }
                start = i + 1;
            }
        }
        System.out.println(input.toString());
    }
}

发表于 2020-04-10 16:38:07 回复(0)
import java.util.*;
public class Main{
    public static void main(String[] args){
        Scanner in = new Scanner(System.in);
        solve(in, 0);
    }
    public static void solve(Scanner in, int index){
        if(in.hasNext()){
            String str = in.next();
            solve(in, index + 1);
            if(index == 0)
                System.out.println(str);
            else System.out.print(str + " ");
        }
    }
}

发表于 2020-03-13 12:15:09 回复(0)

import java.util.Scanner;

public class Main {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
String str=sc.nextLine();
// System.out.println(str);
String[] array=str.split(" ");
/* for (String c:array){
System.out.println(c);
}*/
for (int i = array.length-1; i >=0; i--) {
System.out.print(array[i]+" ");
}
}
}

编辑于 2020-03-07 14:24:53 回复(0)
import java.util.Scanner;
public class Main{
    public String retuenStr(String str){
        StringBuffer result = new StringBuffer();
        if("".equals(str) || null == str){
            return "";
        } else {
            String[] temp = str.split(" ");
            if(null != temp && temp.length > 0){
                for(int i = temp.length - 1; i >= 0 ; i--){
                    result.append(temp[i]).append(" ");
                }
            }
        }
        return result.toString().substring(0, result.toString().lastIndexOf(" "));
    }
    public static void main(String[] args){
        Main ts = new Main();
        Scanner sc = new Scanner(System.in);
        String input = sc.nextLine();
        String s = ts.retuenStr(input);
        System.out.println(s);
    }
}
发表于 2019-12-05 22:44:27 回复(0)