我解決Highest Scoring Word挑戰上Codewars,其中規定 -JS - 爲什麼Codewars這個挑戰在一次測試中返回undefined而另外104次測試通過?
給出的單詞(X)的字符串,你需要找到得分最高的 字。
一個單詞的每個字母根據它在 字母表中的位置得分。 a = 1,z = 26以及其間的所有內容。
您需要將最高得分的單詞作爲字符串返回。
如果兩個單詞得分相同,則返回原始字符串中最早出現的單詞 。
所有字母都是小寫字母,所有輸入都是有效的。
我對這個問題的方法是如下 -
- 構造一個對象,映射字母到它們相應的整數值,像
a - 1
,b - 2
等 - 分割空間上輸入的字符串,每個字 - 找到它的得分副
- 創建單詞的字母
- 地圖的數組該陣列來獲得每個字母
- 的比分戰勝減少這種陣列添加和得到這個詞
陣列中的第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)));
這裏的截圖 -
嘗試第一修剪串和由正則表達式+的/ /而不只是一個單一的空間分開。 – maraca
在線網站上的快速測試告訴我,「bintang」測試用例包含字符串「12」,對此您的地圖沒有任何價值。 'map(a => myObj [a] || 0)'會解決這個問題。 –
@MOehm,與*相矛盾*「所有字母都是小寫字母,所有輸入都是有效的。」* –