899. 有序队列javascript

117 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 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'