首页 > 试题广场 >

单词倒排

[编程题]单词倒排
  • 热度指数:381852 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解

对字符串中的所有单词进行倒排。

说明:

1、构成单词的字符只有26个大写或小写英文字母;

2、非构成单词的字符均视为单词间隔符;

3、要求倒排后的单词间隔符以一个空格表示;如果原字符串中相邻单词间有多个间隔符时,倒排转换后也只允许出现一个空格间隔符;

4、每个单词最长20个字母;

数据范围:字符串长度满足

输入描述:

输入一行,表示用来倒排的句子



输出描述:

输出句子的倒排结果

示例1

输入

I am a student

输出

student a am I
示例2

输入

$bo*y gi!r#l

输出

l r gi y bo
#include<string>
#include<iostream>
#include<vector>
#include<algorithm>
#include<cstring>
#include<cctype>
using namespace std;

int main()
{
    string str;
    getline(cin,str);
    vector<string> vec;
    int begin = 0;
    int len = 0;
    bool renew_begin = true;
    for(int i = 0; i <str.length(); i++)
    {
        if((str[i] >= 'a' && str[i] <= 'z') || (str[i] >= 'A' && str[i] <= 'Z'))
        {
            len++;
            if(renew_begin)
            {
                begin = i;
                renew_begin = false;
 
            }
            if(i == str.length()-1)
            {
                string temp = str.substr(begin,len);
                vec.push_back(temp);
                break;
            }
        }
        else
        {
            if(len>=1)
            {
                string temp = str.substr(begin,len);
                vec.push_back(temp);
                renew_begin = true;
                len = 0;
            }
        }
        
    }
    reverse(vec.begin(), vec.end());
    for(auto it = vec.begin(); it != vec.end(); it++)
    {
        if(it<vec.end()-1)
            cout<<*it<<" ";
        else
            cout<<*it;
    }
    cout<<endl;
    return 0;
}

发表于 2019-02-20 12:22:01 回复(2)
while True:
    try:
        s = input().split()
        res = []
        for i in s:
            t = []
            i = list(i)
            for j in i:
                if j.isalpha():
                    t.append(j)
                else:
                    t.append(" ")
            t = "".join(t).split()
            res.extend(t)
                    
        res = res[::-1]
        for i in res:
            print(i,end=" ")
    except:
        break

发表于 2022-01-04 11:18:13 回复(0)
比之前的句子逆序多一步判断是不是字母
#include<bits/stdc++.h>
using namespace std;
int main()
{
    string x;
    while(getline(cin,x))
    {
        int i;
        for(i=0;i<x.size();i++)
        {
            if(!((x[i]>='a'&&x[i]<='z')||(x[i]>='A'&&x[i]<='Z')))
                x[i]=' ';//判断是不是字母,不是就替换成空格
        }
        string a;
        while(x.find_last_of(' ')!=-1)//找到最后一个空格,输出之后的字符串
        {
            a=x.substr(x.find_last_of(' ')+1);
            cout<<a<<" ";
            x=x.substr(0,x.find_last_of(' '));
        }
        cout<<x<<endl;
    }
    return 0;
}


编辑于 2021-09-22 15:35:03 回复(0)
import java.io.BufferedReader;
import java.io.InputStreamReader;

public class Main {
    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String s = br.readLine();
        StringBuilder sb = new StringBuilder();
        int len = s.length(), i = len - 1, j = i+1;
        while (i > -1) {
            while (i > -1 && Character.isLetter(s.charAt(i))) i--;
            sb.append(s, i + 1, j).append(' ');
            j = i;
            while (i > -1 && !Character.isLetter(s.charAt(i))) i--;
        }
        System.out.println(sb.toString().trim());
    }
}

发表于 2021-09-14 14:58:32 回复(0)
#include <iostream>
#include <string>
#include <vector>
using namespace std;

// 修改了上述一个答案,测试用例全部通过
int main()
{
    string str;
    while (getline(cin, str))
    {
        vector<string> array;
        string temp;
                // 这里i一定要<=str.size()
                // 因为走到最后的'\0',才会进入else,将最后一部分单词push到array中
        for (int i = 0; i <= str.length(); i++)
        {
            if (isalpha(str[i]) && str[i] != '\0')
                temp += str[i];
            else 
            {
                if (temp == "")
                    continue;
                array.push_back(temp);
                temp.clear();
            }
        }
        for (int i = array.size() - 1; i >= 0; i--)
            cout << array[i] << ' ';
        cout << endl;
    }
    return 0;
}

编辑于 2021-06-15 09:22:10 回复(0)
python一行解放有好多中写法
import re

while 1:
    try:
        print(" ".join(" ".join(re.sub(r"[^A-Za-z]", " ", input()).split()).split()[::-1]))
    except:
        break

发表于 2020-02-27 23:26:57 回复(3)
while True:
    try:
        s=list(raw_input().split())
        nn=""
        ll=[]
        l=[]
        for i in range(len(s)):
            ls=list(s[i])
            #print(ls)
            x=len(ls)
            mm=[]
            for j in range(x):
                #print(j)
                if ls[j].isalpha():
                    mm.append(ls[j])
                else:
                    mm.append(" ")
            ss="".join(mm)
            ss.strip()
            l=list(ss.split())
            for i in l:
                ll.append(i)
        ll=ll[::-1]
        print(" ".join(ll))
    except:
        break

发表于 2019-07-12 20:31:15 回复(0)
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;

int main()
{
    string inn;
    while(getline(cin,inn))
    {
        string str;
        for(char temp:inn)
        {
            if((temp<='Z'&&temp>='A')||(temp<='z'&&temp>='a'))
                str += temp;
            else if(str.length()>0&&str.back()!=' ')
                str += ' ';
        }
        // ==================== 注意 =====================
        // 末尾可能有空格,要删除,90%的通过率就是这里的问题.
        // ===============================================
        if(str.back()==' ')
            //str.erase(str.end()-1);
            str.erase(str.length()-1);
        int start = 0;
        while(1)
        {
            int ind = str.find(' ',start);
            if(ind>=0)
                reverse(str.begin()+start,str.begin()+ind);
            else
            {
                reverse(str.begin()+start,str.end());
                break;
            }
            start = ind+1;
        }
        reverse(str.begin(),str.end());
        if(str.length()==0)
            cout<<' '<<endl;
        else
            cout<<str<<endl;
    }
    return 0;
}

发表于 2018-08-15 11:23:02 回复(0)
#include <iostream>
#include <string.h>
using namespace std;
 
char str[10000];
char dic[10000][22];
 
int main()
{
    while(gets(str))
    {
        int flag = 0;//判断是否是第一个空格
        int len = strlen(str), it = 0, Word = 0;//单词个数
        for(int i=0;i<len;i++)
        {
            if((str[i]>='a'&&str[i]<='z') || (str[i]>='A'&&str[i]<='Z'))
            {
                flag = 1;
                dic[Word][it++] = str[i];
            }
            else
            {
                if(flag == 1)
                {
                    dic[Word][it] = '\0';
                    it = 0;
                    Word++;
                    flag = 0;
                }
            }
        }
        dic[Word][it] = '\0';
         
        for(int i=Word;i>=0;i--)
        {
            if(dic[i][0]!='\0')//他可能出现句首不是字母的情况
            {
                cout<<dic[i];
                if(i)
                    cout<<" ";
            }
 
        }
        cout<<endl;
    }
        return 0;
}

发表于 2017-02-01 00:31:01 回复(2)
import java.util.Scanner;
public class Main{
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        while(sc.hasNextLine()){
            String str = sc.nextLine();
            String[] rs = str.split("[^a-zA-Z]");
            String[] b = new String[rs.length];
            for(int i = rs.length-1 ; i >= 0 ; i--){
                b[rs.length-1-i] = rs[i];
                System.out.print(b[rs.length-1-i] + " ");
            }
        }
    }
}
发表于 2021-11-04 15:41:04 回复(0)
import java.io.BufferedReader;
import java.io.InputStreamReader;

public class Main {
    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String[] str = br.readLine().split("[^A-Za-z]+");
        int length = str.length;
        StringBuilder sb = new StringBuilder();
        for (int i = length - 1;i >= 0;i--){
            sb.append(str[i] + " ");
        }
        System.out.println(sb.toString().trim());
    }
}

发表于 2022-07-14 15:24:46 回复(0)
<?php
    $str = trim(fgets(STDIN));

    preg_match_all("/([a-zA-Z]+)/", $str, $matchs);
    
    echo implode(' ', array_reverse($matchs[0]));
?>
发表于 2022-07-06 12:42:07 回复(0)
import java.util.*;
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String s = sc.nextLine();
        List<String> list = new ArrayList<>();
        StringBuilder sb = new StringBuilder();
        for(int i=0;i<s.length();i++){
            char ch = s.charAt(i);
            int j = i;
            while((ch>='a' && ch<='z') || (ch>='A' && ch<='Z')){
                j++;
                if(j>=s.length()) break;
                ch = s.charAt(j);
            }
            if(j>i){
                list.add(s.substring(i,j));
            }
            i=j;
        }
        for(int i=list.size()-1;i>=1;i--){
            sb.append(list.get(i));
            sb.append(' ');
        }
        sb.append(list.get(0));
        System.out.println(sb.toString());
    }
}
发表于 2022-05-23 10:46:01 回复(0)
n=input()
for i in range(len(n)):
    if not n[i].isalpha():
        n=n.replace(n[i], ' ')
list=n.split(' ')
list.reverse()
for i in list:
    print(i,end=' ')

发表于 2022-05-17 20:24:40 回复(0)
/***  2/26
一、思路
1.将非大小写字母的char全部替换成空格
    注意:只能用replace() 不能用replaceAll()
2.用split(" ")将string分隔进String[]
3.倒序输出

二、匹配非字母的字符进行分割
1.我的思路:将非字母字符全部替换成空格,再用空格分隔
2.其他:正则表达式[^a-zA-Z]分割:String[] words = str.split("[^A-Za-z]");

三、一些比较:
str = str.replace(String.valueOf(c)," ")时,运行时间:134ms,占用内存:17400KB
改为str = str.replace(c,' ')后               运行时间:48ms,占用内存:11548KB,提升30%多

四、知识点:replace() 与 replaceAll()
1.String replace(char oldChar, char newChar)
返回一个新的字符串,它是通过用 newChar 替换此字符串中出现的所有 oldChar 得到的。
2.String replaceAll(String regex, String replacement)
使用给定的 replacement 替换此字符串所有匹配给定的正则表达式的子字符串。
3.replaceAll用的是正则,replace用的是字符,二者都能替换*所有*匹配的字符
示例:
String str = "hello.hello.hello";
System.out.println(str.replace(".","#"));      //hello#hello#hello
System.out.println(str.replaceAll(".","#"));   //#################
System.out.println(str.replaceAll("\\.","#")); //hello#hello#hello
***/
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        while (sc.hasNext()) { 
            String str = sc.nextLine();
            char[] chs = str.toCharArray();
            for(char c : chs){
                if(!Character.isLetter(c)){
                    str = str.replace(c,' ');
                }
            }
            String[] strArr = str.split(" ");
            for(int i = strArr.length-1; i>=0; i-- ){
                System.out.print(strArr[i] + " ");
            }     
        }
        
    }
}

发表于 2022-05-05 16:14:40 回复(0)
import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        while (sc.hasNext()) {
            String[] strArr = sc.nextLine().split(" ");
            StringBuilder sb = new StringBuilder();
            for (int i = strArr.length - 1; i >= 0; i--) {
                StringBuilder temp = new StringBuilder();
                for (char ch : strArr[i].toCharArray()) {
                    if (Character.isLetter(ch)) {
                        temp.append(ch);
                    } else {
                        temp.append(" ");
                    }
                }
                
                String tempStr = temp.toString();
                if (tempStr.contains(" ")) {
                    String[] tempArr = tempStr.split(" ");
                    for (int j = tempArr.length - 1; j >= 0 && tempArr[j].length() > 0; j--) {
                        sb.append(tempArr[j] + " ");
                    }
                } else {
                    sb.append(tempStr + " ");
                }
            }
            System.out.println(sb.substring(0, sb.length() - 1));
        }
    }
}
发表于 2022-04-19 19:57:13 回复(0)
console.log(readline().split(/[^a-zA-Z]/).reverse().join(' ').trim())
发表于 2022-04-17 14:15:06 回复(0)
import java.util.Scanner;
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        while(sc.hasNextLine()){
            String content = sc.nextLine();
            content.trim();
            char[] ch = content.toCharArray();
            String newContent = "";
            if(Character.isLetter(ch[0])){
                newContent += ch[0];
            }
            for(int i = 1;i < ch.length ; i++){
                if(Character.isLetter(ch[i])){
                    newContent += ch[i];
                }else{
                    if(Character.isLetter(ch[i-1])){
                        newContent += " ";
                    }
                }
            }
            String[] strArray = newContent.split(" ");
            for(int i = strArray.length-1;i >= 0;i--){
                System.out.print(strArray[i]+" ");
            }
            System.out.println();
        }
    }
}

发表于 2021-11-28 22:22:51 回复(0)
package main

import (
	"bufio"
	"fmt"
	"os"
)

func main(){

	// 读取终端输入
	var scanner = bufio.NewScanner(os.Stdin)
	scanner.Scan()
	var str = scanner.Text()

	// 逆序打印,如果非字母只打印空格
	var slice []string
	var tempStr = ""
	for i:=0;i<len(str);i++ {
		if (str[i] >= 97 && str[i]  <= 122) || (str[i]  >= 65 && str[i] <= 90) {
			tempStr = tempStr + string(str[i])
			if i == len(str) -1 {
				slice = append(slice, tempStr)
			}
		}else {
			slice = append(slice, tempStr)
			tempStr = ""
		}
	}

	for i:=len(slice)-1;i>=0;i-- {
		fmt.Printf("%v ",slice[i])
	}

}

发表于 2021-11-07 10:42:49 回复(0)
没想出一行代码解法,等大佬来
def tran(a: str):
    if a.isalpha():
        return a
    else:
        return ' '

print(' '.join((''.join(map(tran, input()[::1]))).split()[::-1]))


发表于 2021-11-06 16:14:32 回复(2)