首页 > 试题广场 >

单词倒排

[编程题]单词倒排
  • 热度指数:381950 时间限制: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
import java.util.Scanner;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        String str = in.nextLine();
        System.out.print(reverseWords(str));


    }
    public static String reverseWords(String str) {
        String s = str.replaceAll("[^a-zA-Z0-9]"," ");
        // 使用空格分割句子成单词数组
        String[] words = s.split(" ");
        // 创建一个StringBuilder用于构建逆序后的句子
        StringBuilder sb = new StringBuilder();

        // 逆序遍历单词数组
        for (int i = words.length - 1; i >= 0; i--) {
            // 将单词添加到StringBuilder
            sb.append(words[i]);
            // 如果不是最后一个单词,添加一个空格
            if (i > 0) {
                sb.append(" ");
            }
        }

        // 返回逆序后的句子
        return sb.toString();
    }
}

发表于 2024-11-11 21:43:19 回复(0)
import java.util.Scanner;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        while (scanner.hasNext()) {
            String word = scanner.nextLine();
            String str = "";
            //特殊字符变为空格
            for (int i = 0; i < word.length(); i++) {
                char ch = word.charAt(i);
                if ((ch >= 'A' && ch <= 'Z') || (ch >= 'a' && ch <= 'z')) {
                    str += ch;
                } else {
                    str += " ";
                }
            }
            String words[] = str.split(" ");
            String reverseWord = "";
            //倒置数据
            for (int i = 0; i < words.length; i++) {
                reverseWord += words[words.length - i - 1] + " ";
            }

            String reverseWords[] = reverseWord.split(" ");
            String finalString = "";
            for (int i = 0; i < reverseWords.length; i++) {
                finalString += reverseWords[i] + " ";
            }
            // 将多余空格置换为一个空格
            finalString = finalString.replaceAll("\\s+", " ");
            System.out.println(finalString.trim());

        }
        scanner.close();
    }
}

发表于 2024-09-25 21:16:45 回复(0)
import java.util.Scanner;
import java.util.*;
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        // 注意 hasNext 和 hasNextLine 的区别
        while (in.hasNext()) { // 注意 while 处理多个 case
            String[] arr = in.nextLine().split("[^A-Za-z]");
            List<String> l = new ArrayList<String>();
            for (String a : arr) {
                l.add(a);
            }
            Collections.reverse(l);
            System.out.println(String.join(" ", l));
        }
        in.close();
    }
}
发表于 2024-09-10 16:48:47 回复(0)
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Scanner;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
         Scanner in = new Scanner(System.in);
        String str = in.nextLine();
        str = str.replaceAll("[^a-zA-Z]+"," ");
        List<String> list = new ArrayList<>();
        list = Arrays.asList(str.split(" "));
        Collections.reverse(list);
        String strResult = String.join(" ",list);
        System.out.println(strResult);
    }
}

发表于 2024-09-07 18:11:14 回复(0)
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        String str = in.nextLine();
        char[] res = str.toCharArray();
        reverse(res, 0, res.length - 1);
        int start = 0;
        for (int i = 0; i < res.length; i++) {
            if (res[i] >= 'a' && res[i] <= 'z' || res[i] >= 'A' && res[i] <= 'Z') {
                continue;
            } else {
                res[i] = ' ';
            }
        }
        for (int i = 0; i < res.length; i++) {
            if (res[i] != ' ' && (i == 0 || res[i - 1] == ' ')) {
                start = i;
            }
            if (res[i] != ' ' && (i == res.length - 1 || res[i + 1] == ' ')) {
                reverse(res, start, i);
            }
        }
        System.out.println(new String(res));
    }

    public static void reverse(char[] array, int l, int r) {
        while (l < r) {
            char temp = array[l];
            array[l] = array[r];
            array[r] = temp;
            l++;
            r--;
        } //O(n)
    }
}
发表于 2024-08-19 11:39:50 回复(0)
import java.util.Scanner;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        String str = in.nextLine();
        String[] strArr = str.split("[^A-Za-z]");

        for(int i = strArr.length -1; i >= 0; i--) {
            if (strArr[i].length() > 0) {
                System.out.print(strArr[i] + " ");
            }
        }
    }
}
发表于 2024-06-03 22:09:16 回复(0)
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Scanner;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        String str = in.nextLine();
        List<String> list = new ArrayList<>();
        String strTemp = new String();
        for(int i = 0;i<str.length();i++){
            char c = str.charAt(i);
            if(c <= 'z' && c>='a'){
                strTemp += c;
            }else if(c <='Z' && c>='A'){
                strTemp += c;
            }else{
                if(strTemp != null && strTemp.length()>0){
                    list.add(strTemp);
                }
                strTemp = "";
            }
        }
        list.add(strTemp);
        Collections.reverse(list);
        String strResult = String.join(" ",list);
        System.out.println(strResult);
    }
}

编辑于 2024-04-25 15:56:18 回复(0)
借助栈结构先进后出的特点,天生适合做倒序。大小写字母的ascII码刚好也记得,这样就可以了
Stack<String> stack = new Stack<>();

Scanner in = new Scanner(System.in);
String str = in.nextLine();

String tempstr = "";
for(int i=0;i<str.length();i++){
char c = str.charAt(i);
if(c >= 97 && c <=122) {
tempstr += c;
}else if(c>=65 && c<=90) {
tempstr += c;
}else {
stack.push(tempstr);
tempstr = "";
}
}
stack.push(tempstr);

String resp = stack.pop();
while(!stack.isEmpty()) {
resp = resp + " " + stack.pop();
}

System.out.println(resp);

编辑于 2024-04-18 18:40:28 回复(0)
import java.util.Scanner;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        // 注意 hasNext 和 hasNextLine 的区别
        while (in.hasNext()) { // 注意 while 处理多个 case
            String s = in.nextLine();
            StringBuilder sb = new StringBuilder(s);
            int count = 0;
            int nullIndex = -1;
            for (int i = 0; i < sb.length(); i++) {
                char ch = sb.charAt(i);
                if ((ch >= 'A' && ch <= 'Z') || (ch >= 'a' && ch <= 'z')) {
                    //将从nullIndex开始,长度为count的字符全部置为空范围是左闭右开
                    if (nullIndex != -1) {
                        sb.replace(nullIndex, nullIndex + count, " ");
                        count = 0;
                        nullIndex = -1;
                    }
                    continue;
                } else {
                    //这种情况就是非构成单词的字符了
                    if (nullIndex == -1)
                        nullIndex = i;
                    count++;
                }
            }
            String [] arr = sb.toString().split(" ");
            int left = 0;
            int right = arr.length - 1;
            while(left < right){
                swap(arr, left++, right--);
               
            }
            String res = String.join(" ", arr);
            System.out.println(res);
        }
    }

    public static void swap(String [] arr, int i, int j){
        String ch = arr[i];
        arr[i] = arr[j];
        arr[j] = ch;
    }
}
发表于 2024-03-29 10:56:20 回复(0)
import java.util.*;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        // 注意 hasNext 和 hasNextLine 的区别
        while (in.hasNextLine()) { // 注意 while 处理多个 case
            String inString = in.nextLine();
            List<String> arr = new ArrayList<>();
            String s = "";
            for (int i = 0 ; i < inString.length() ; i++) {
                if (Character.isLetter(inString.charAt(i))) {
                    s += inString.charAt(i);
                    //对最后一个单词单独添加
                    if (!"".equals(s) && i == inString.length() - 1) {
                        arr.add(s);
                    }
                } else {
                    if (!"".equals(s)) {
                        arr.add(s);
                    }
                    s = "";
                }
            }
            //倒排
            Collections.reverse(arr);

            String res = "";
            for (String part : arr) {
                res += part + " ";
            }
            System.out.println(res);
        }
    }
}

发表于 2023-12-28 10:46:24 回复(0)
import java.util.Scanner;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        // 注意 hasNext 和 hasNextLine 的区别
        String str = in.nextLine();

        int right = str.length() - 1;
        int left = right;
        StringBuffer res = new StringBuffer();
        while (right>=0) {

            while (left >= 0 && Character.isLetter(str.charAt(left))) {
                left--;
            }

            res.append(str.substring(left + 1, right + 1));
            if(left != 0){
                res.append(" ");
            }
            while(left>=0 && !Character.isLetter(str.charAt(left))){
                left--;
            }
            right = left;
        }

        System.out.println(res.toString());

    }
}
使用双指针解决,和H13句子逆序相同,一并解决
编辑于 2023-12-04 04:16:12 回复(0)
import java.util.*;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        String[] a = in.nextLine().split("[^a-zA-Z]");
        for(int i = a.length-1 ;i>=0;i--){      
            System.out.print(a[i]+" ");
        }        
    }
}
正则固然好用,就是还不熟练
发表于 2023-10-23 03:59:24 回复(0)
强烈建议大家学一下正则表达式,真的超好用
import java.util.Scanner;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        String str = in.nextLine();
        String[] strs = str.split("[^a-zA-Z]");
        for (int i = strs.length-1; i >= 0; i--) {
            System.out.print(strs[i]+" ");
        }
    }
}


发表于 2023-09-27 17:27:07 回复(0)
import java.util.Scanner;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        String str=in.nextLine();
        int index=str.length()-1;
        for(int i=index;i>=0;i--){
            if(!((str.charAt(i)>='A'&&str.charAt(i)<='Z')||
                    (str.charAt(i)>='a'&&str.charAt(i)<='z'))){
                for(int j=i+1;j<str.length();j++){
                    if((str.charAt(j)>='A'&&str.charAt(j)<='Z')||
                            (str.charAt(j)>='a'&&str.charAt(j)<='z')){
                        if(j==str.length()-1){
                            System.out.print(str.charAt(j)+" ");
                        }else {
                            System.out.print(str.charAt(j));
                        }
                    }else {
                        System.out.print(" ");
                        break;
                    }
                }
            }else if(((str.charAt(i)>='A'&&str.charAt(i)<='Z')||
                    (str.charAt(i)>='a'&&str.charAt(i)<='z'))&&i==0){
                for(int j=0;j<str.length();j++){
                    if((str.charAt(j)>='A'&&str.charAt(j)<='Z')||
                            (str.charAt(j)>='a'&&str.charAt(j)<='z')){
                        System.out.print(str.charAt(j));
                    }else {
                        break;
                    }
                }
            }
        }
    }
}

发表于 2023-09-17 16:23:38 回复(0)
import java.util.Scanner;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String line = br.readLine();

        System.out.println(reverse1(line));
    }

    /**
     * 字符串单词反转
     *
     * @param line
     */
    private static String reverse1(String line) {
        StringBuilder result = new StringBuilder();
        StringBuilder sb = new StringBuilder();
        for (int i = line.length() -1; i >= 0; i--) {
            char c = line.charAt(i);
            if (Character.isLetter(c)){
                sb.append(c);
            }else {
                result.append(sb.reverse());
                result.append(" ");
                sb.delete(0, sb.length());
            }
        }

        result.append(sb.reverse());
        return result.toString();
    }
}

发表于 2023-08-08 09:14:37 回复(0)
import java.util.Scanner;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
      Scanner in = new Scanner(System.in);
        StringBuilder stringBuilder = new StringBuilder();
        // 注意 hasNext 和 hasNextLine 的区别
        while (in.hasNextLine()) { // 注意 while 处理多个 case
            String s = in.nextLine();
            char[] chars = s.toCharArray();
            for (char aChar : chars) {
                if(!(aChar>='a' && aChar <= 'z' || aChar >= 'A' && aChar <= 'Z')) {
                    aChar = ' ';
                    stringBuilder.append(aChar);
                }else{
                    stringBuilder.append(aChar);
                }

            }
            String[] s1 = stringBuilder.toString().split(" ");
            for (int i = s1.length - 1; i >= 0; i--) {
                System.out.print(s1[i] + " ");
            }

        }
        in.close();
    }
}
发表于 2023-08-07 23:48:23 回复(0)
import java.util.*;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        // 注意 hasNext 和 hasNextLine 的区别
        while (in.hasNextLine()) { // 注意 while 处理多个 case
            String str = in.nextLine();
            // System.out.println(str);
            ArrayList<String> list = getStrArr(str);
            // System.out.println(list);
            int n = list.size();
            for(int i = n-1;i>-1;i--){
                if(i==0){
                    System.out.print(list.get(i));
                } else {
                    System.out.print(list.get(i)+" ");
                }
            }
        }
    }

    public static ArrayList<String> getStrArr(String input) {
        ArrayList<String> wordList = new ArrayList<String>();
        int n = input.length();

        String tempStr = "";
        for (int i = 0; i < n; i++) {
            char tempChar = input.charAt(i);
            // System.out.println(tempChar);

            if ((tempChar >= 'A' && tempChar <= 'Z') || (tempChar >= 'a' &&
                    tempChar <= 'z')) {
                tempStr = tempStr + tempChar;
                if (i == n - 1) {
                    wordList.add(tempStr);
                }
            } else {
                if (!tempStr.equals("")) {
                    wordList.add(tempStr);
                    // System.out.println(tempStr);
                    tempStr = "";
                    continue;
                } else {
                    continue;
                }
            }
        }

        return wordList;

    }
}

发表于 2023-07-05 22:13:07 回复(0)
import java.util.*;
public class Main {
    public static void main(String[] args)
    {
        Scanner in = new Scanner(System.in);
        String[] src = in.nextLine().split("[^A-Za-z]");
        StringBuilder srcs = new StringBuilder();
        for(int i = src.length-1;i >= 0;i--)
        {
            srcs.append(src[i]).append(" ");
        }
        System.out.println(srcs.toString().trim());
    }
}
发表于 2023-07-02 22:14:24 回复(0)
import java.util.Scanner;
import java.util.LinkedList;
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        String line = in.nextLine();
        in.close();
        //最初概要思路:
        //遇到一个字符
        //1,是大小写字母
        //          前一个不是特殊字符,拼接
        //          前一个是特殊字符,创建
        //2,是特殊字符
        //          前一个不是特殊字符,存字符入数组
        //          前一个是特殊字符,跳过
        /* 编码思路
            用双指针,index ,left , right
            开始时 left==right ,notLetter=true
            遇到字母 right++
            遇到特殊字符   if(right >= left && !notLetter) 截取,
                    再遇到字母,left=right=index,notLetter=false
            到末尾,再判断一次 if(right >= left && !notLetter) 截取
         */
        int index=0 ,left=0 , right = 0;
        boolean notLetter = true;
        LinkedList<String> lsList = new LinkedList<>();
        char[] charArray = line.toCharArray();
        while (index < charArray.length) {
            if (Character.isLetter(charArray[index])) {
                right = notLetter ? index : right +1;
                if (notLetter) {
                    left = index;
                    notLetter = false;
                }
            }else {
                if(right >= left && !notLetter){
                    lsList.push(String.copyValueOf(charArray,left,right-left+1));
                }
                notLetter = true;
            }
            index++;
        }
        if(right >= left && !notLetter){
            lsList.push(String.copyValueOf(charArray,left,right-left+1));
        }
        while (!lsList.isEmpty()) {
            System.out.print(lsList.pop());
            if (lsList.size() > 0) {
                System.out.print(" ");
            }
        }
    }
}

发表于 2023-06-11 10:48:28 回复(0)