我解决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,与*相矛盾*“所有字母都是小写字母,所有输入都是有效的。”* –