算法打卡第五天

97 阅读2分钟

最近生活和工作上有很多杂七杂八的事,断了一段时间,继续打卡。又是没做出来的一天(摆烂.jpg)

今日打卡题目:899. 有序队列 题目描述

给定一个字符串 s 和一个整数 k 。你可以从 s 的前 k 个字母中选择一个,并把它加到字符串的末尾。
返回 在应用上述步骤的任意数量的移动后,字典上最小的字符串 。

今天钻了牛角尖,还有就是被左上角的困难骗了,想的很难,看了官方解析感觉这道题最多算个中等。

错误的思考历程:
       看到找最小字符串,首先想到的就是排序。又一次移动一个,就自己写了一个长一点的字符串来模拟找思路,首先想的是找0-k的最大值,然后放到最后一位,结果模拟的结果一直死循环。考虑换成最小值,依旧行不通。
       接下来就想着先排序,然后按排序后的值移动,这个时候就开始跑偏了,题目最后要求的输出是最小字符串,所以重点是排序,并不是移动。我的重点一直在移动上了,所以一直卡壳。

官方思路
情况一:k=1
找 s 中排列最小的字符串顺序
情况二:k>1
直接排序输出即可

注释的是看了官解后的错误解法,没有考虑到连续多个最小字母的情况。例如:aaa。

var orderlyQueue = function(s, k) 
{ 
    if(k==1) { 
        // let min = 'z' 
        // for(let i = 0; i<s.length; i++) { 
        // if(s[i] < min) min = s[i] 
        // } 
        // let minIndex = s.indexOf(min) 
        // console.log(minIndex) 
        // return s.slice(minIndex,s.length)+s.slice(0,minIndex) 
        let ans = s 
        for(let i = 0; i < s.length; i++) { 
        s = s.slice(1,s.length) + s[0]
        ans = ans > s ? s : ans } 
        return ans 
        }
    else { 
        return s.split("").sort().join("") 
        } 
    };

总结:

  1. 不要被表面欺骗;
  2. 抓住重点,不要跑偏;
  3. 多考虑重复情况。