删除字符串中的重复字符

时间:2013-06-07 13:02:52

标签: javascript

我有这个功能:

function CreateHiddenWord() {
    var wordsTable = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'];
    var Hiddenletter = wordsTable[Math.floor((Math.random() * 26) + 1)];
    return Hiddenletter;
}
var WordToGuess += CreateHiddenWord();

如何检查WordToGuess中是否有重复字符,如果有,请再次致电CreateHiddenWord

3 个答案:

答案 0 :(得分:3)

除了实际返回单个字母而不是单词的令人困惑的函数名称:

do {
    var newChar = CreateHiddenWord();
} while (WordToGuess.indexOf(newChar) >= 0)
WordToGuess += newChar;

然而,值得注意的是,这个循环不能保证永远不会退出!如果你只是创建小的随机字符串,它可能不是问题,但如果你尝试创建一个27个字符的字符串,它显然不会工作!你的字符串越长,绘制一个你以前没画过的随机字符就越难。

更好的解决方案是创建候选字母数组,绘制随机字母,然后从数组中删除该字母。这样你就不必继续循环来尝试找到非重复的东西。

我会寻找类似的东西(假设变量length包含所需的字符串长度):

function WordGenerator() {
    var letters = ['A','B','C',...];
    this.GetNextLetter = function() {
        if (letters.length) {
            var index = Math.floor(Math.random * letters.length);
            return letters.splice(index,1)[0];
        }
    }
}

然后,当你想要一个新词时:

var myGenerator = new WordGenerator();
var word = "";
for (var i=0; i < length; i++) {
    word += myGenerator.GetNextLetter();
}

答案 1 :(得分:2)

您可以使用do...while循环,直到获得唯一字符。同样使用String.indexOf会告诉您重复项:

var WordToGuess = "MYWORD";
do {
    var char = GetRandomCharacter();
} while ( WordToGuess.indexOf(char) > -1 );   

WordToGuess += char;

function GetRandomCharacter() {
    var wordsTable = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'];
    var Hiddenletter = wordsTable[Math.floor((Math.random() * 26) + 1)];
    return Hiddenletter;
}

实际上其中一个地方do...while比常规while更好。

答案 2 :(得分:0)

/(.)\1/将匹配双字符。

对不起,我应该更好地解释一下!

这是regular expression使用如下......

if (/(.)\1/.test( WordToGuess )) CreateHiddenWord();

/分隔正则表达式

(.)匹配任何字符并将其记录为捕获的组

\1匹配任何第一组(在这种情况下,紧接在前的组) - 即重复。

.test()将此表达式应用于字符串,并评估为true匹配,false不匹配。