2017-08-24 61 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'));

相关问题