leetcode
leetcode 1651 ~ 1700
将句子排序

将句子排序

难度:

标签:

题目描述

代码结果

运行时间: 20 ms, 内存: 0.0 MB


/*
 * 思路:
 * 1. 将输入字符串按空格分割成单词数组。
 * 2. 使用流根据每个单词末尾的数字进行排序。
 * 3. 移除每个单词末尾的数字。
 * 4. 将单词数组拼接成原始顺序的句子。
 */

import java.util.Arrays;
import java.util.stream.Collectors;

public class Solution {
    public String sortSentence(String s) {
        return Arrays.stream(s.split(" "))
                     .sorted((a, b) -> Character.getNumericValue(a.charAt(a.length() - 1)) - Character.getNumericValue(b.charAt(b.length() - 1)))
                     .map(word -> word.substring(0, word.length() - 1))
                     .collect(Collectors.joining(" "));
    }
}

解释

方法:

这个解题思路基于两步处理。首先,将字符串s按空格分割得到单词数组。然后,根据每个单词末尾的数字(从1到9),将单词放到一个新的数组中正确的位置。数字在单词中的位置确定了单词在原句子中的顺序。这个数字随后从单词中移除,得到的单词是原始单词,无数字。最后,新数组中的单词按顺序连接起来,形成一个整理后的句子。

时间复杂度:

O(n^2)

空间复杂度:

O(n)

代码细节讲解

🦆
在处理句子排序时,为什么选择使用数字在单词中的存在作为判断基准,而不是其他特征?
这种方法选择的原因是题目特定的格式要求,即每个单词的末尾带有一个数字,这个数字直接指示了单词在句子中的排序位置。使用这个数字作为排序基准,可以直接且有效地确定每个单词的正确位置,这比使用其他特征(如单词长度或字母表顺序)更为直接和符合题目要求。
🦆
算法中内层循环检查数字是否在单词中使用了哪种具体的字符串操作方法,这种方法是否最优?
算法使用了字符串的 'in' 操作来检查数字是否存在于单词中。这种方法简单且易于实现,但并不是最优的,因为它只能判断数字是否存在,却不能准确判断数字是否为单词末尾的字符。更优的方法是使用正则表达式来确保数字位于单词的末尾,或者直接检查单词末尾字符是否为目标数字。
🦆
你如何处理字符串中潜在的重复数字,比如单词 'this11' 如何避免误判为 'this1'?
为了避免类似的误判,应该在检查数字时确保它是单词末尾的字符。可以通过检查单词的最后一个字符是否为目标数字,而不是简单地使用 'in' 操作。这样可以确保即使单词中有重复数字,也只有正确位置的数字会被用于排序。
🦆
代码使用了两个数组,一个用于分割单词,一个用于重排单词。是否有必要使用两个数组,还是可以通过原地修改达到相同的效果?
使用两个数组可以使逻辑更清晰,易于管理和理解。尽管可能通过原地修改数组或使用额外的数据结构(如哈希表)来优化空间复杂度,但这可能会使代码更复杂,难以维护。对于这种简单的问题,清晰和直接的解法通常更受推荐。

相关问题