我正在做这个非常简单的 codewars kata 下面是问题所在:
An isogram is a word that has no repeating letters, consecutive or non-consecutive. Implement a function that determines whether a string that contains only letters is an isogram. Assume the empty string is an isogram. Ignore letter case.
function isIsogram(str){
var letter = str.toLowerCase().split("");
for(var i = 0; i < letter.length; i++) {
if(letter.indexOf(letter[i].toLowerCase()) > -1){
return false;
}
}
return true;
}
我的解决方案总是返回 false,因为我在 indexOf 中的数组比较了我的字符串中的每个字母。该解决方案应该将数组与自身进行比较,如果没有重复字母则返回 true。但对我来说不幸的是,当将数组与自身进行比较时,它会将数组中的每个字母与自身进行比较,所以基本上即使数组中只有该字符的一个字母,因为它再次与自身进行比较,它将返回虚假陈述。
这个问题让我很苦恼。
最佳答案
检查 Array#lastIndexOf (它从末尾搜索)与当前索引相同。如果不是,则它不是唯一的:
function isIsogram(str){
var letter = str.toLowerCase().split("");
for(var i = 0; i < letter.length; i++) {
if(letter.lastIndexOf(letter[i]) !== i){
return false;
}
}
return true;
}
console.log(isIsogram('subdermatoglyphic'));
console.log(isIsogram('rare'));
更好的解决方案是使用 Set 来比较唯一字符的数量与原始字符串中的字符数:
const isIsogram = (str) => new Set(str.toLowerCase()).size === str.length;
console.log(isIsogram('subdermatoglyphic'));
console.log(isIsogram('rare'));
关于javascript - 如何跳过两个相同数组索引之间的比较?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46655421/