算法初探LeetCode-将句子排序

196 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第25天,点击查看活动详情

LeetCode31:将句子排序

一个 句子 指的是一个序列的单词用单个空格连接起来,且开头和结尾没有任何空格。每个单词都只包含小写或大写英文字母。

我们可以给一个句子添加 从 1 开始的单词位置索引 ,并且将句子中所有单词 打乱顺序 。

比方说,句子 "This is a sentence" 可以被打乱顺序得到 "sentence4 a3 is2 This1" 或者 "is2 sentence4 This1 a3" 。 给你一个 打乱顺序 的句子 s ,它包含的单词不超过 9 个,请你重新构造并得到原本顺序的句子。

示例 1:

输入:s = "is2 sentence4 This1 a3"
输出:"This is a sentence"
解释:将 s 中的单词按照初始位置排序,得到 "This1 is2 a3 sentence4" ,然后删除数字。

示例 2:

输入:s = "Myself2 Me1 I4 and3"
输出:"Me Myself and I"
解释:将 s 中的单词按照初始位置排序,得到 "Me1 Myself2 and3 I4" ,然后删除数字。

提示:

  • 2 <= s.length <= 200
  • s 只包含小写和大写英文字母、空格以及从 1 到 9 的数字。
  • s 中单词数目为 1 到 9 个。
  • s 中的单词由单个空格分隔。
  • s 不包含任何前导或者后缀空格。

思路分析

根据题意和提供的示例:

  • 首先就是split()方法来获得每个单词,然后构建一个新的已经排序好的String数组
  • 然后遍历所有的单词,获得他们排序后应该所在的位置并存在index中。 这里-48 是ASCII码中0的ASCII码是48,所以字符的数字要减去48才能获得对应的真的数字
  • 存到之前构建的排序好的数组中再用StringBuilder将他们连接起来即可

整体还算是简单的,时间上能超过90%,思路简单易懂小白追求的第一要素。复杂的数据结构和算法其实可能要在掌握了最基础的方法之后再去考虑。毕竟这是能想出的最快、最直观的解法

算法代码

public String sortSentence(String s) {
    String[] words = s.split(" ");
    String[] sortedWords = new String[words.length];

    for (String word : words) {
        int index = word.charAt(word.length() - 1) - 48;
        StringBuilder newString = new StringBuilder();
        for (int i = 0; i < word.length() - 1; i++) {
            newString.append(word.charAt(i));
        }
        sortedWords[index - 1] = newString.toString();
    }

    StringBuilder newSentence = new StringBuilder();
    for (int i = 0; i < sortedWords.length; i++) {
        if (i != sortedWords.length - 1) {
            newSentence.append(sortedWords[i]).append(" ");
        } else {
            newSentence.append(sortedWords[i]);
        }
    }
    return newSentence.toString();
}

结果详情

Snipaste_2022-12-23_22-28-49.png

算法复杂度

  • 空间复杂度:O(n)O(n)
  • 时间复杂度:O(n)O(n)

掘金(JUEJIN)一起进步,一起成长!