最近生活和工作上有很多杂七杂八的事,断了一段时间,继续打卡。又是没做出来的一天(摆烂.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("")
}
};
总结:
- 不要被表面欺骗;
- 抓住重点,不要跑偏;
- 多考虑重复情况。