2017-08-24 59 views
2

我解決Highest Scoring Word挑戰上Codewars,其中規定 -JS - 爲什麼Codewars這個挑戰在一次測試中返回undefined而另外104次測試通過?

給出的單詞(X)的字符串,你需要找到得分最高的 字。

一個單詞的每個字母根據它在 字母表中的位置得分。 a = 1,z = 26以及其間的所有內容。

您需要將最高得分的單詞作爲字符串返回。

如果兩個單詞得分相同,則返回原始字符串中最早出現的單詞 。

所有字母都是小寫字母,所有輸入都是有效的。

我對這個問題的方法是如下 -

  1. 構造一個對象,映射字母到它們相應的整數值,像a - 1b - 2
  2. 分割空間上輸入的字符串,每個字 - 找到它的得分副
    • 創建單詞的字母
    • 地圖的數組該陣列來獲得每個字母
    • 的比分戰勝減少這種陣列添加和得到這個詞
  3. 陣列中的第2步返回將有得分在原始字符串中每個單詞的總成績。找到此數組中的最大值並獲取它的位置,並從該特定位置的原始字符串中返回單詞。

    我的代碼片段(演示here) -

function high(x) { 
 
    let myObj = {}; 
 
    for (let i = 1; i <= 26; i++) { 
 
    myObj[String.fromCharCode(i + 96)] = i; 
 
    } 
 
    // console.log(myObj); 
 

 
    let scores = x.split(' ').map(word => [...word].map(a => myObj[a]).reduce((a, b) => a + b, 0)); 
 

 
    return x.split(' ')[scores.indexOf(Math.max(...scores))]; 
 
} 
 

 
console.log(high('take me to semynak'))

當我在codewars運行這個,結果顯示,104個通過了測試,1失敗,1個錯誤。唯一的信息。關於所示的故障/錯誤是 -

預計:「星級」,而不是得到了:未定義

由於沒有顯示該測試用例實際輸入此信息。本身並不是很有用。

我試圖想一些邊緣情況下,如具有相同比分兩個字,但即使如此,.indexOf()應該返回先前的值的位置,你可以看到在這個例子 -

let nums = [1, 2, 3, 3]; 
 
console.log(nums.indexOf(Math.max(...nums)));

這裏的截圖 -

enter image description here

+0

嘗試第一修剪串和由正則表達式+的/ /而不只是一個單一的空間分開。 – maraca

+0

在線網站上的快速測試告訴我,「bintang」測試用例包含字符串「12」,對此您的地圖沒有任何價值。 'map(a => myObj [a] || 0)'會解決這個問題。 –

+0

@MOehm,與*相矛盾*「所有字母都是小寫字母,所有輸入都是有效的。」* –

回答

2

該問題的陳述說,單詞將只包含小寫字母,但不能保證輸入字符串只包含單詞和空格。

爲了解釋標點符號,數字和其他非單詞,您需要將所有小寫字母序列提取爲單詞(而不是將輸入字符串拆分爲空格)。

function high(x) { 
 
    let words = x.split(/[^a-z]+/); 
 
    let scores = words.map(word => [...word].map(a => a.charCodeAt(0) - 96).reduce((a, b) => a + b, 0)); 
 
    return words[scores.indexOf(Math.max(...scores))]; 
 
} 
 
    
 
console.log(high('today is 24 august, 2017'));

相關問題