JS - 为什么这个Codewars挑战返回未定义的一个测试,而其他104个测试通过?

时间:2017-08-24 06:23:28

标签: javascript algorithm optimization

我正在解决Codewars的Highest Scoring Word挑战,其中指出了

  

给定一串单词(x),你需要找到最高得分   字。

     

一个单词的每个字母根据它在中的位置得分   字母。 a = 1,z = 26以及介于两者之间的一切。

     

您需要将得分最高的单词作为字符串返回。

     

如果两个单词得分相同,则返回最早出现的单词   原始字符串。

     

所有字母均为小写,所有输入均有效。

我对问题的处理方法如下 -

  1. 构造一个对象,将字母映射到相应的整数值,如a - 1b - 2等。
  2. 在空格上拆分输入字符串,对于每个单词 - 通过以下方式找到它的分数 -
    • 创建单词' s字母的数组
    • 映射数组以获得每个字母的分数
    • 通过添加减少此数组并获得单词
    • 的总分
  3. 步骤2中返回的数组将包含原始字符串中每个单词的分数。找到此数组中的最大值并获取它的位置,从该特定位置的原始字符串返回单词。

    我的代码段(演示here) -

  4. 
    
    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'))
    &#13;
    &#13;
    &#13;

    当我在代码大战中运行时,结果显示104次通过测试,1次失败,1次错误。唯一的信息。关于显示的失败/错误是 -

      

    预期:&#39; bintang&#39;而是得到:undefined

    由于未显示此测试用例的实际输入,因此该信息。本身并不是很有用。

    我试着考虑一些边缘情况,比如两个具有相同分数的单词,但即便如此.indexOf()也应返回前一个值的位置,如本例所示 -

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

    这是截图 -

    enter image description here

1 个答案:

答案 0 :(得分:2)

问题陈述说单词只包含小写字母,但并不保证输入字符串只包含单词和空格。

为了计算标点符号,数字和其他非单词,您需要将所有小写字母序列提取为单词(而不是仅在空格上分割输入字符串)。

&#13;
&#13;
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'));
&#13;
&#13;
&#13;