我实现了用于检查传入的字符串是否唯一的算法。我觉得我的算法是正确的,但是显然在某些情况下,它给出了错误的结果。为什么?
function isUnique(str) {
let sortedArr = str.split('').sort();
for (let [i, char] of sortedArr.entries()) {
if (char === sortedArr[i + 1]) {
return false
} else {
return true
}
}
}
console.log(isUnique('heloworld')) // true
答案 0 :(得分:25)
$('.menu-box').click(e => {
let id = e.target.data('menu-listing');
// first remove the class from all items
$('.menu-preview-items').removeClass('.active');
// now add back the active class for the item we care about
$(`#${id}`).addClass('.active');
});
立即终止该函数,因此只有return
循环可以运行时才进行第一次迭代。相反,您应该检查所有字符是否唯一(如果不是,则在循环内为for
),否则为return false
在循环结束后:
return true
但是使用function isUnique(str) {
let sortedArr = str.split('').sort();
for(let [i,char] of sortedArr.entries()) {
if(char === sortedArr[i + 1]) {
return false
}
}
return true
}
console.log(isUnique('heloworld'))
可能会容易得多,看看它的大小是否等于字符串的长度:
Set
请查看评论,谢谢Patrick:如果您需要考虑由多个UCS-2代码点(function isUnique(str) {
return new Set(str).size === str.length;
}
console.log(isUnique('heloworld'))
console.log(isUnique('abc'))
等)组成的字符,请调用字符串迭代器并检查返回的项目数,可以使用扩展名或(否则,
Array.from
的计算结果将无法达到正确的单个字符数):
str.length
答案 1 :(得分:0)
仅运行for循环中的第一次迭代(因为您始终执行“返回”)。相反,您可以使用以下代码
function isUnique(str, t={})
{
return ![...str].some(c=> t[c]=c in t)
}
console.log('heloworld =>',isUnique('heloworld'));
console.log('helo =>',isUnique('helo'));