我有一个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("")
}
问题是,有时它会输出与输入相同的值。如果我解读&#34; TREE&#34;它可能会出现&#34; TREE&#34;。 如果输出与输入不同,如何在输出之前检查并再次运行功能?
谢谢! 布伦丹
答案 0 :(得分:1)
你可以使用递归并再次调用你的函数,直到你知道你没有返回你开始使用的相同字符串。旁注:您的改组会创建一个全局变量d
。在判断新变量时尝试使用var
。
编辑:根据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"))
&#13;
答案 1 :(得分:0)
使用递归,在函数结束时,检查输出是否等于输入,如果是,则return scramble(a);
如果不是return scrambled_text;
我还建议将变量重命名为更具可读性,上面的示例return语句假设您已重命名变量,并且您的加扰文本存储的变量是我所称的scrambled_text
答案 2 :(得分:0)
递归方法是想到的,因此你可能会做如下事情;然而概率是奇怪的,并且总是(尽管非常非常罕见)被卡住了#34;
。
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"))
&#13;