【刷题日记】899. 有序队列

简介: 【刷题日记】899. 有序队列

一、题目描述:

有序队列,这是一个字符串的题目,看看需要如何处理

image.png

二、这道题考察了什么思想?你的思路是什么?

题目中给出的描述,实际上是需要我们按照条件,将原有字符串,调整成一个字典上最小的字符串,简单来说,尽可能的按照从小到大排序这个字符串

分析

咱们根据题目可以知道,需要关注题目给出的 k 的值,我们注意看 当 k == 1的时候,我们无论如何,都只能将字符串的第1个字符移动到尾部,来比较是不是字典序最小的

例如示例 1 中, k==1

源串 c b a
调整 1 次 b a c
调整 2 次 a c b

调整后,我们进行比较,发现 acb 才是最小的

若 还是 示例 1 ,但是我们令 k == 2 ,看看会有啥不一样的

源串 c b a
调整 1 次 b a b
调整 2 次 a b c

调整后,我们发现答案是 abc,当然,不要关注调整的次数,这个次数是根据实际的字符串而变动的

实际上我也不用举太多的例子了,细心的我们可以发现

当 k = 2 的时候,我们总是能在字符串的前 k(k>1) 个字符中选择最小的一个字符丢到字符串尾部,直到整个字典序是最小的

经过我们多次试验之后,可以发现,实际上就是对字符串进行排序而已

那么,接下来就是翻译代码的时候了,根据这个分析来看,其实这个题蛮简单的,只需要考虑清楚 k 为 1 和 大于 1 的情况

三、编码

根据上述逻辑和分析,我们就可以翻译成如下代码

  • 需要明确分类处理 k == 1的情况,咱们只能 1 个字符 1 个字符的向字符串尾巴后面移动,来比较大小
  • K > 1 的时候,按照上述分析,咱们直接排序就可以了

编码如下:


func orderlyQueue(s string, k int) string {
    if k == 1 {
        res := s
        for i := 1; i < len(s); i++ {
            // 将第一个元素移动到最后,查看哪个字符串最大
            s = s[1:] + s[:1]
            if s < res {
                res = s
            }
        }
        return res
    }
    t := []byte(s)
    sort.Slice(t, func(i, j int) bool { return t[i] < t[j] })
    return string(t)
}

四、总结:

image.png

这个题咱们的解决方式其实还是比较明确和简单的,可能看上去时间复杂度可能会有点高,此处的时间复杂度我们需要从 2 个方面来看,k为 1的情况,咱们的时间复杂度是 O(n^2),空间复杂度是 O(n)

当 k>1 的情况下,我们可以看出来,咱们使用了排序算法,时间复杂度是 O(nlogn)

原题地址:899. 有序队列

欢迎点赞,关注,收藏

朋友们,你的支持和鼓励,是我坚持分享,提高质量的动力

image.png

好了,本次就到这里

技术是开放的,我们的心态,更应是开放的。拥抱变化,向阳而生,努力向前行。

我是阿兵云原生,欢迎点赞关注收藏,下次见~

相关文章
Spring5源码(45)-@Transactional声明式事物(三)事物创建
Spring5源码(45)-@Transactional声明式事物(三)事物创建
109 0
|
运维 监控 Shell
掌握100个开箱即用的Shell脚本~(附PDF)
Shell脚本是实现Linux系统管理及自动化运维所必备的重要工具。许多其它岗位的小伙伴也经常使用Shell脚本来实现某项需求。 今天分享《100个shell脚本案例》,共有55页,支持文字搜索定位,代码清晰可复制。
|
前端开发 JavaScript 搜索推荐
webpack进阶篇(十七):静态资源内联
webpack进阶篇(十七):静态资源内联
535 0
webpack进阶篇(十七):静态资源内联
|
人工智能 缓存 运维
ACK计费相关概念
ACK计费相关概念
106 4
|
搜索推荐 算法 Java
桶排序就是这么容易
桶排序就是这么容易
103 0
|
缓存 索引
Hudi Log日志文件写入分析(二)
Hudi Log日志文件写入分析(二)
147 1
|
数据采集 监控 数据可视化
深入理解Python协程:提升并发编程效率浅谈Python在数据分析中的应用
在本篇文章中,我们将探索Python协程的内部机制及其在并发编程中的应用。不同于常规的技术文章仅停留在表面的介绍,我们将通过深入分析协程如何在单线程内实现并发的执行,揭示其背后的原理和优势。进一步,文章还将展示如何利用协程处理高并发任务,通过比较传统多线程和协程的性能差异,让读者全面了解协程在现代Web开发中的重要性和实用性。 本文将探讨Python语言在数据分析领域的关键作用和优势。不同于传统的技术文章摘要,我们将通过一个具体的案例,即如何使用Python进行数据清洗、处理和可视化,来展示Python在处理实际数据分析问题中的高效和易用性。此外,文章还将简要介绍几个主要的Python数据
|
Python
内核与应用分离
内核与应用分离
145 0
|
存储 编译器 Linux
【C++初阶:STL —— string】string类 | 浅拷贝和深拷贝(传统写法和现代写法) | string类的模拟实现 下
【C++初阶:STL —— string】string类 | 浅拷贝和深拷贝(传统写法和现代写法) | string类的模拟实现
650 0
【C++初阶:STL —— string】string类 | 浅拷贝和深拷贝(传统写法和现代写法) | string类的模拟实现 下
|
Web App开发 移动开发 前端开发
【JavaWeb】Html与Css语法简介(上)
【JavaWeb】Html与Css语法简介(上)
【JavaWeb】Html与Css语法简介(上)