2017-10-09 89 views
1

我做低於這個很簡單codewars卡塔的問題是:如何跳過兩個相同數組索引之間的比較?

的等值線是一個沒有重複的字母,連續或 不連續的一句話。實現一個函數,該函數確定僅包含字母的字符串 是否等值線圖。假設空字符串爲等值線圖形 。忽略信箱。因爲內的indexOf我陣列我的字符串中的每個字母比較

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。解決方案應該將數組與自身進行比較,如果沒有重複的字母,則返回true。但不幸的是,當我將數組與自身進行比較時,它將比較數組中的每個字母,因此基本上即使數組中只有一個字母的字母,因爲它再次與自身比較,它將會返回虛假陳述。

這個問題在殺我。

+1

在你的if語句中,你能添加類似'&& letter.indexOf(letter [i] .toLowerCase())!== i'嗎? – Nick

+1

您最好先對字符串進行排序,然後將其移動並將當前字母與下一個字母進行比較。你的算法被認爲是慢的。 – Rafael

回答

2

檢查是否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'));

+0

Theres使用indexOf和lastIndexOf之間沒有區別,只有一個更快。 –

+0

區別在於用法:您可以使用'lastIndexOf()',並將其與當前索引或帶有起始位置的indexOf()進行比較,並檢查結果是否爲-1。 –

+0

我剛把''-1'換成'!== i',基本解決了我的問題。這非常有意義,因爲如果獲得該字母的索引(如果該索引不等於其索引),即使該索引確實如此,它也會返回false!我喜歡邏輯!謝謝! – Ken

1

更簡單:

check = str => new Set(str.toLowerCase()).size === str.length; 

或者,如果你想解決您的代碼,使用兩個循環:

for(var i = 0; i < letter.length; i++) { 
    for(var j = i+1; j < letter.length; j++){ 
    if(letter[i] === letter[j]) return false; 
    } 
} 
1
function isIsogram(str){ 
    var letter = str.toLowerCase().split(""); 

    for(var i = 0; i < letter.length; i++) { 
    for (var y = i + 1; y < letter.length; y++) { 
     if (letter[i] === letter[y]) 
      return false; 
    } 
    } 
    return true; 
} 

通過不重複的比較

0

額外的效率下面是使用@rafael提出的方法更有效的解決方案:按字母順序重新排列字和增量比較每個字母下。如果有匹配,立即返回false。

function isIsogram(word) { 
    word = word.split('').sort().join('').toLowerCase(); 
    for (var i = 0; i < word.length; i++) { 
    if (word[i] === word[i+1]) { 
     return false; 
    } 
    } 
    return true; 
} 
+1

最有效的解決方案是使用Set或對象來記住以前看到的字母(但實際上,這不值得爲這些小數據進行優化)。 – 4castle

相關問題