• 【字符串】有序队列 排序


    题目描述

    给定一个字符串s和一个整数k。你可以从s的前k个字母中选取一个,将它放到字符串的末尾。

    请返回执行上述步骤任意次数后,字典上最小的字符串。

    示例1:

    输入:s = "cba", k = 1
    输出:"acb"
    解释:
    在第一步中,我们将第一个字符(“c”)移动到最后,获得字符串 “bac”。
    在第二步中,我们将第一个字符(“b”)移动到最后,获得最终结果 “acb”。

    解题思路 

    这道题只需要考虑2种情况:

    • case1:k等于1的情况,如果k等于1,则需要找到字符串重最小的字符,然后按照最小的字符做subString操作,最终获得所有的字符串,接着对字符串进行一次排序,取第一个字符串。按照上述思路,代码如下:
        char min = s.charAt(0);
        List list = new ArrayList<>();
        char[] chars = s.toCharArray();
        for (int i = 0; i < chars.length; i++) {
            char c = chars[i];
            if (c < min) {
                min = c;
                list = new ArrayList<>();
                list.add(i);
            } else if (c == min) {
                list.add(i);
            }
        }
    
        List list1 = new ArrayList<>();
        for (Integer index : list) {
            list1.add(s.substring(index) + s.substring(0, index));
        }
        Collections.sort(list1);
        return list1.get(0);
    • case1:k大于1的情况,由于k大于1一定能获得一个按照字符顺序排列的字符串,所以只需要按照字符顺序排序,然后返回这个字符串,代码如下: 
    char[] array = s.toCharArray();
    Arrays.sort(array);
    return new String(array);

    代码实现 

    综合上述代码,给出实现代码:

    1. import java.util.ArrayList;
    2. import java.util.Arrays;
    3. import java.util.Collections;
    4. import java.util.List;
    5. class Solution {
    6. public String orderlyQueue(String s, int k) {
    7. if (k > 1) {
    8. char[] array = s.toCharArray();
    9. Arrays.sort(array);
    10. return new String(array);
    11. } else {
    12. char min = s.charAt(0);
    13. List list = new ArrayList<>();
    14. char[] chars = s.toCharArray();
    15. for (int i = 0; i < chars.length; i++) {
    16. char c = chars[i];
    17. if (c < min) {
    18. min = c;
    19. list = new ArrayList<>();
    20. list.add(i);
    21. } else if (c == min) {
    22. list.add(i);
    23. }
    24. }
    25. List list1 = new ArrayList<>();
    26. for (Integer index : list) {
    27. list1.add(s.substring(index) + s.substring(0, index));
    28. }
    29. Collections.sort(list1);
    30. return list1.get(0);
    31. }
    32. }
    33. }

    总结

    这道题不是很复杂,主要在考虑清楚如何获取字典上最小的字符串。通过分析,能发现k=1时需要做字符串排序操作,当k>1时只需要对原来的字符串做排序就可以了。

    通过上述代码能比较快速的解决上述问题,期望有更加高效的方案给出来,欢迎回复。

  • 相关阅读:
    视图(view)
    sqllab第二十七A关通关笔记
    代码规范:C++函数的高级特性
    音乐播放器蜂鸣器ROM存储歌曲verilog,代码/视频
    莫比乌斯召回系统介绍
    47、以Orienmask实例分割算法为例子,学习TensorRT的Python和C++开发
    LightDB版本发布 13.8-23.3
    【正点原子STM32连载】第十八章 独立看门狗(IWDG)实验 摘自【正点原子】MiniPro STM32H750 开发指南_V1.1
    qt5.15.2+vs2019源码调试开发环境搭建
    Solon 1.8.0 发布,云原生微服务开发框架
  • 原文地址:https://blog.csdn.net/weiliuhong1/article/details/126151084