携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第18天,点击查看活动详情
题目:
给定一个字符串 s 和一个整数 k 。你可以从 s 的前 k 个字母中选择一个,并把它加到字符串的末尾。
返回 在应用上述步骤的任意数量的移动后,字典上最小的字符串 。
leedcode地址👉:899.有序队列
示例 1:
输入:s = "cba", k = 1
输出:"acb"
解释:
在第一步中,我们将第一个字符(“c”)移动到最后,获得字符串 “bac”。
在第二步中,我们将第一个字符(“b”)移动到最后,获得最终结果 “acb”。
示例 2:
输入:s = "baaca", k = 3
输出:"aaabc"
解释:
在第一步中,我们将第一个字符(“b”)移动到最后,获得字符串 “aacab”。
在第二步中,我们将第三个字符(“c”)移动到最后,获得最终结果 “aaabc”。
提示:
1 <= k <= S.length <= 1000
s 只由小写字母组成。
分析:
看起来似乎当k=1,即只可以移动一位数字时比较粗暴,只移动一位那就把移动后的结果一一列出,最后比较得出最小的字符串即可。
那 k>1时,似乎可行性又增加了,操作字符串的方法有无数种。例如:
gjxrun 拿这个字符串举例吧。就讨论当k=2时吧。
gjxrun 按照阿拉伯数字排列大小为126543.
265431->654312->543126
431265->312654->126543->265431->654312->643125->431256
312564->125643->156432->564321->643215->.....................................
好麻烦,反正一直移动总会变成从小到大排列的数字的,因为无数种可能的移动方法。
总之,意思就是,只需要考虑k=1时的情况,因为不像>1时那么宽容,可以移动的次数很固定。
当k=2时直接使用sort()从小到大排序即可。反正最后必然可以排列成功。
代码实现:
var orderlyQueue = function(s,k){
if(k=1){
let res = s;
for(let i of s){
s = s.subStr(1)+s[0];
if(res>s) res = s;
}
}
else{
res = [...s].sort().join("")
}
return res;
}
区分一下subStr与subString与splice:
str.substr(start, [length])
-
substr()会从start获取长度为length字符(如果截取到字符串的末尾,则会停止截取)。 -
如果
start是正的并且大于或等于字符串的长度,则substr()返回一个空字符串。(下方例子最后一个) -
若
start为负数,则将该值加上字符串长度后再进行计算(如果加上字符串的长度后还是负数,则从0开始截取,下方例子倒数第二个)。 -
如果
length为0或为负数,substr()返回一个空字符串。如果length省略,则将substr()字符提取到字符串的末尾。
var str = 'abcdefghij';
str.substr(1, 2); // '(1, 2): bc'
str.substr(-3, 2); // '(-3, 2): hi'
str.substr(-3)); // '(-3): hij'
str.substr(1)); // '(1): bcdefghij'
str.substr(-20, 2)); // '(-20, 2): ab'
str.substr(20, 2)); // '(20, 2): ab'