2017-06-16 86 views
1

我正在嘗試完成代碼挑戰的樂趣。這是場景。使功能更具性能

function scramble(str1,str2)返回true如果str1字符的部分可以被重新排列以匹配str2,否則返回false

例如:
str1'rkqodlw'str2'world'輸出應返回true
str1'cedewaraaossoqqyt'str2'codewars'應返回true
str1'katas'str2'steak'應返回false

我寫的函數有效,但需要很長時間才能執行所有可能的測試。我怎樣才能讓我的功能更高效?提前致謝。

這裏是我寫的函數:

function scramble(str1, str2) { 
    for (var i = 0; i < str1.length; i++) { 
    str2 = str2.replace(str1.charAt(i),''); 
    } 
    return str2.length == 0 ? true : false; 
} 
+0

你是什麼意思「太長」 ? 'scramble(「piosdjfpasoidjfkoawmesfjatkjdsngfayksndglkjysngdlkjantokgsdannkogjmaoriewjgaeoirneorijgaeirgwoef」,「hello」)'在我的機器上需要0.06ms –

+0

'return str2.length == 0? true:false;'可以重寫'return!str2.length;'。對於(var i = 0,j = str1.length; i

+0

61次測試通過後,由於「完成時間超過12000ms」而出錯。 – Josh

回答

1

我要去嘗試,現在編寫代碼,但也許不同的計算策略能給有趣的結果。 基本上我的想法是:

  • 創建一個空的對象
  • 開始通過STR2循環:獲取當前的信,是新創建的 對象已調用屬性「當前信」,增加的 屬性的值一個,或者與值添加到該項目的屬性「當前 字母」現在1
  • 爲對象的每個屬性,計算如果STR1信具有 至少儘可能多的出現爲屬性的值

下面是代碼:

let lettersCounter = new Object(); 
for (let i = 0; i < str2.length; i++) { 
    if (typeof lettersCounter[str2[i]] !== 'undefined'){ 
     lettersCounter[str2[i]] ++; 
    } else { 
     lettersCounter[str2[i]] = 1; 
    } 
} 
let props = Object.keys(lettersCounter); 
for (let i = 0; i < props.length; i ++){ 
    let currLetter = props[i]; 
    if ((str1.split(currLetter).length) <= lettersCounter[currLetter]){ 
     return false; 
    } 
} 
return true; 

我覺得這裏真的薄弱點是str1.split - 很可能會更快使用正則表達式 - 但我討厭寫作的正則表達式,所以我要離開,要你:)

哦,因爲一些在評論中寫道,你應該做一些初始化的檢查,如STR1 === STR2和str2.length < = str1.length