Skip to content

LCR 181. 字符串中的单词反转

2024秋招中国电信笔试题目
题目链接:https://leetcode.cn/problems/fan-zhuan-dan-ci-shun-xu-lcof/description/

小回说过,当你无法从一楼蹦到三楼时,不好忘记走楼梯。要记住伟大的成功往往不是一蹴而就的,务必学习并领悟分解你的目标,逐步实施。 题目描述

你在与一位习惯从右往左阅读的朋友发消息,他发出的文字顺序都与正常相反但单词内容正确,为了和他顺利交流你决定写一个转换程序,把他所发的消息 message 转换为正常语序。 注意:输入字符串 message 中可能会存在前导空格、尾随空格或者单词间的多个空格。返回的结果字符串中,单词间应当仅用单个空格分隔,且不包含任何额外的空格。

题目示例

示例 1:

输入: message = "the sky is blue"
输出: "blue is sky the"
示例 2:

输入: message = "  hello world!  "
输出: "world! hello"
解释: 输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。
示例 3:

输入: message = "a good   example"
输出: "example good a"
解释: 如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。

题目解析

这个题我们可以使用双指针或者split函数来解决,先对我们的原的字符串进行一个去除字符串 前后的空字符串,然后进行遍历。 如果使用双指针的话,让i和j都指向最后一个字符,i向前移动,遇到空的时候,截取i到j之间的字符串 然后在跳过字符串前面的空格,指向上一个字符串的末尾,我们直接看代码,很容易理解

双指针-题目代码

java
class Solution {
    public static String reverseMessage(String message) {
        message = message.trim();
        int len = message.length();
        int i = len - 1;
        int j = len - 1;
        StringBuilder builder = new StringBuilder();
        while (i >= 0) {
            //第二个循环和第三个循环都要有i>=0的条件,因为第一个单词结束之后i=-1,charAt(-1)会报错
            while (i >= 0 && message.charAt(i) != ' ') {
                i--;
            }
            builder.append(message.substring(i + 1, j + 1)).append(" ");
            //在来一个while循环处理多个空格的情况
            while (i >= 0 && message.charAt(i) == ' ') {
                i--;
            }
            //此时i指向另一个单词的末尾
            j = i;
        }
        return builder.toString().trim();
    }
}

split-题目代码

java
class Solution {
    /**
     * 使用StringBuilder 预备知识:x个空格经过split(" ")会得到x-1的空串
     *
     * @param message
     * @return
     */
    public String reverseMessage(String message) {
        message = message.trim();
        String[] strings = message.split(" ");
        StringBuilder builder = new StringBuilder();
        for (int i = strings.length - 1; i >= 0; i--) {
            if ("".equals(strings[i])) {
                continue;
            }
            builder.append(strings[i]).append(" ");
        }
        return builder.toString().trim();
    }
}

这道题目你甚至也可以使用正则表达式,把多个空格给替换成一个空格,那么题目就变得非常easy了 但是前提是你得知道正则的写法

本站访客数 人次 本站总访问量