我有一个任务,即扰乱一个单词,其大小超过3个字母。
加扰的单词不得等于原始单词,单词的第一个和最后一个字母必须保持不变。
例如,单词stack
可以给出以下结果之一:
例如,is
或hey
这样的字词会因为太小而保持不变。
我尝试这样做可以在下面看到。我有一个JavaScript函数,它接收一个字来加扰,然后我选择一定限度内的随机索引来创建一个新的加扰字并返回它。如果我选择的索引已被选中,那么我再次尝试希望获得新的结果。
/**
* Returns a scrambled word with the first and last letters unchanged
* that is NOT EQUAL to the given parameter 'word', provided it has
* more than three characters.
*/
function scrambleWord(word){
if(word.length <= 3)
return word;
var selectedIndexes, randomCharIndex, scrambledWord = word;
while(word === scrambledWord){
selectedIndexes = [], randomCharIndex, scrambledWord = '';
scrambledWord += word[0];
for(var j = 0; j < word.length-2; j++){
//select random char index making sure it is not repeated
randomCharIndex = getRandomInt(1, word.length-2);
while(selectedIndexes.indexOf(randomCharIndex) > -1 && selectedIndexes.length != word.length-2){
randomCharIndex = getRandomInt(1, word.length-2);
}
scrambledWord += word[randomCharIndex];
selectedIndexes.push(randomCharIndex);
}
scrambledWord += word[word.length-1];
}
return scrambledWord;
}
/**
* Returns a random integer between min (inclusive) and max (inclusive)
* Using Math.round() will give you a non-uniform distribution!
* See: http://stackoverflow.com/a/1527820/1337392
*/
function getRandomInt(min, max) {
return Math.floor(Math.random() * (max - min + 1)) + min;
}
这种方法的问题在于它太慢了。我没有通过测试,因为我超过了6秒的时间限制,所以我肯定需要改进这个解决方案,但我看不到我能做到的地方。
有什么想法吗?
答案 0 :(得分:4)
有一个答案Here可以处理快速改变字符串的方法。你需要做的只是取下你正在做的第一个和最后一个字母,用这个方法来改变字符串,然后用你的第一个和最后一个字母来修复。
为了完整起见,我会留下你的支票,你得到的答案与以前的答案不同,并且检查字符串是&gt;这些3个字符是您的要求所特有的。
这应该比你已经拥有的速度快得多,因为这是你随机抽奖的所有时间!