重复Scramble功能,直到输出与输入不同



我有一个javascript函数,它接受一个字符串并打乱字母:

function scramble(a){
    a=a.split("");
    for(var b=a.length-1;0<b;b--){
        var c=Math.floor(Math.random()*(b+1));d=a[b];a[b]=a[c];a[c]=d;
    }
    return a.join("")
}

问题是,有时它输出的值与输入的值相同。如果我对"TREE"进行解码,结果可能是"TREE"。如果输出与输入没有不同,我如何在输出之前检查并再次运行函数?

谢谢!布伦丹

您可以使用递归并再次调用函数,直到您知道返回的不是开始时的字符串。旁注:您的洗牌创建了一个全局变量d。当声明一个新变量时,尝试使用var

EDIT:正如user3297291所建议的那样,应该检查以确保输入至少有2个字符长,并且不仅仅是重复字符串的整个长度的相同字符。否则,我们将被置于一个无限循环中。

function scramble(a){
    if (a.length < 2 || isAllRepeats(a))
      return a;
    var b = a.split("");
    for(var i = b.length - 1; 0 < i; i--){
        var c = Math.floor(Math.random()*(i+1));
        var d=b[i];b[i]=b[c];b[c]=d;
    }
    var newString = b.join("");
    if (newString === a)
      return scramble(newString);
    return newString;
}
function isAllRepeats(a) {
  var first = a[0];
  var isRepeats = true;
  a.split('').forEach(function(letter) {
    if (letter != first)
      isRepeats = false;
  });
  return isRepeats;
}
console.log(scramble("TREE"))
console.log(scramble("A"))
console.log(scramble("AAAAA"))

使用递归,在函数结束时,检查输出是否等于输入,如果是则return scramble(a);,如果不是则return scrambled_text;

我也建议重命名你的变量更容易读,我上面的例子返回语句假设你已经重命名了变量,无论你的打乱文本存储在什么变量中,我都称之为scrambled_text

递归方法是想到的,因此你可能会这样做;然而,概率是一种奇怪的东西,总是有(尽管非常非常非常罕见)被"鱼"困住的可能性。

function scramble(s){
  function shuffle(a){
    var i = a.length,
        j,
      tmp;
    while (i > 1) {
      j = Math.floor(Math.random()*i--);
      tmp = a[i];
      a[i] = a[j];
      a[j] = tmp;
    }
    return a;
  }
  var t = shuffle([...s]).join("");
  return t === s ? scramble(s) : t;
}
console.log(scramble("fish"))

相关内容

  • 没有找到相关文章

最新更新