【力扣】1859.将句子排序

该博客主要介绍了如何对包含单词和数字的字符串进行排序和重构。提供了两种不同的解决方案,一种使用TreeMap,另一种通过数组下标直接排序。这两种方法都能有效地重建原始句子的顺序。

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

我们可以给一个句子添加 从 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 不包含任何前导或者后缀空格。

 代码:

方式一:TreeMap

class Solution {
    public String sortSentence(String s) {
        TreeMap treemap = new TreeMap();//TreeMap是有序的(是否有序指的是key)
        String[] strs=s.split(" ");//将字符串按空格截取到数组中
        int key=-1;
        for(int i=0;i<strs.length;i++){
            key=strs[i].charAt(strs[i].length()-1)-'0';//获取每个单词后面的数字作为key
            String value=strs[i].substring(0, strs[i].length()-1);//截取单词作为value
            treemap.put(key,value);
        }
        StringBuilder s1= new StringBuilder();
        for(int i=1;i<= strs.length;i++){
            s1.append(treemap.get(i)+" ");//将所有单词按空格进行连接
        }
        return s1.substring(0,s1.length()-1);//去掉结尾的空格
    }
    public static void main(String[] args) {
        Solution s=new Solution();
        System.out.println(s.sortSentence("is2 sentence4 This1 a3"));
    }
}

 方式二:通过数组下标将对应元素进行排序

class Solution {
    public String sortSentence(String s) {
        String[] strs = s.split(" ");
        String[] res = new String[strs.length];
        for (String str : strs) {
            // 获取每个单词后面的数字作为数组下标存储单词,通过这种方式实现排序
            int count = str.charAt(str.length() - 1) - '0' - 1;//减1,数组下标从零开始
            // 将单词存到数组中
            res[count] = str.substring(0, str.length() - 1);
        }
        return String.join(" ", res);//拼接
    }
}

 

力扣第31题“下一个排列”的题目要求是实现获取下一个排列的函数,将给定数字序列重新排列成字典序中下一个更大的排列。若不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列),且必须原地修改,只允许使用额外常数空间[^1][^2][^4]。 ### 解题思路 要找到一个更大的排列,需从后往前找,找到那个突然变小的值,然后用后面比它稍微大一点的值去替换它,再把它原来位置之后的所有值反序。具体步骤如下: 1. 从末尾寻找第一个破坏降序的数。 2. 在该数之后的序列中寻找第一个大于它的数,交换这两个数。 3. 将交换位置之后的序列按升序排列(可通过反序实现)。 若整个数组是降序排列的,则不存在下一个更大的排列,需将数组重置为最小的排列(即升序排序)[^3][^5]。 ### 代码实现 以下是使用C++实现的代码: ```cpp #include <iostream> #include <vector> #include <algorithm> class Solution { public: void nextPermutation(std::vector<int>& nums) { // 获得最大长序 int pos = nums.size() - 1; // 1. 从末尾寻找第一个破坏降序的数 while(pos > 0 && nums[pos] <= nums[pos-1]) pos--; // 2. 找到第一个比它大的数,交换 if(pos > 0){ for(int i = nums.size()-1 ; i>=pos ; i--){ if(nums[i] > nums[pos-1]){ std::swap(nums[pos-1], nums[i]); break; } } } // 3. 升序排列 std::reverse(nums.begin() + pos, nums.end()); } }; ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

aigo-2021

您的鼓励是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值