代码战争:哪些是?词典顺序(Javascript)

时间:2016-11-22 17:11:13

标签: javascript sorting lexicographic-ordering

我目前正在尝试使用javascript在Codewars中解决以下问题。 以下是问题:

"给定两个字符串数组a1和a2以a1的字符串的字典顺序返回一个排序数组r,这是a2字符串的子串。"

以下是我为此问题撰写的代码:

function inArray(array1,array2){
  var result = [];
  var newResult = [];

  for(var i = 0; i < array2.length; i++) {
    for(var j = 0; j < array1.length; j++) {
      if(array2[i].includes(array1[j])) {
        result.push(array1[j])
      }
    }
  }

  for(var k = 0; k < result.length; k++) {
    if(result[k] !== result[k+1]) {
      newResult.push(result[k]);
    }
  }

  return newResult.sort();
}

以下是我必须通过的示例测试:

a2 = ["lively", "alive", "harp", "sharp", "armstrong"]
a1 = ["xyz", "live", "strong"]
Test.assertSimilar(inArray(a1, a2), ["live", "strong"])
a1 = ["live", "strong", "arp"]
Test.assertSimilar(inArray(a1, a2), ["arp", "live", "strong"])
a1 = ["tarp", "mice", "bull"]
Test.assertSimilar(inArray(a1, a2), [])

我的代码似乎通过了所有示例测试,但我无法通过所有规范。它说我在10个规格中失败了5个规格。 我不知道为什么我失败了这些规格。 我的代码有问题,还是有什么方法可以让我的代码更好?

4 个答案:

答案 0 :(得分:0)

我建议更改for循环(以array1开头,而不是array2),如果找到该项,则使用标签跳过内循环。

使用此方法,您无需过滤重复项的结果。

function inArray(array1, array2) {
    var i, j, result = [];

    outer: for (j = 0; j < array1.length; j++) {
        for (i = 0; i < array2.length; i++) {
            if (array2[i].includes(array1[j])) {
                result.push(array1[j]);
                continue outer;
            }
        }
    }
    return result.sort();
}

var Test = {
    assertSimilar: function (a, b) {
        console.log('result', a);
        console.log('given', b);
    }
};

a2 = ["lively", "alive", "harp", "sharp", "armstrong"];
a1 = ["xyz", "live", "strong"];
Test.assertSimilar(inArray(a1, a2), ["live", "strong"]);
a1 = ["live", "strong", "arp"];
Test.assertSimilar(inArray(a1, a2), ["arp", "live", "strong"]);
a1 = ["tarp", "mice", "bull"];
Test.assertSimilar(inArray(a1, a2), []);
.as-console-wrapper { max-height: 100% !important; top: 0; }

答案 1 :(得分:0)

并不是说你应该在Stack Overflow上寻求解决kata的解决方案,但因为你几乎就在这里,我的想法就是。

首先,当不确定为什么失败的最终测试使用console.log()并查看正在测试的值,甚至可能是预期结果(取决于写入kata的方式)。

其次,您的解决方案不起作用,因为您在最终答案中包含了双打/重复项。

我目前正在使用集合去除JS代码中的重复项。集合仅包含唯一值,非常酷。如果在代码中添加以下三行代替当前返回,它应该通过所有测试:

var setOfRes = new Set(newResult.sort());
var array = Array.from(setOfRes);
return array;

是的,我正在从一个数组转换为一个Set来摆脱重复,然后再回到一个数组中。它可以通过许多其他方式完成,但集合是一个很好的工具,所以这是我的建议。

答案 2 :(得分:0)

function inArray(arrA, arrB){
  let arr = arrB.join(" ")
  return arrA.filter(item => arr.search(item) !== -1 && item !== undefined ).sort()

}

答案 3 :(得分:0)

您需要使用.sort()

function inArray(array1,array2){
  var x;
  var y;
  var r = [];
  for (x = 0; x < array1.length; x++) { 
    for (y = 0; y < array2.length; y++) {
      if(array2[y].includes(array1[x]) === true){
          r.push(array1[x]);
      }else{

      }
    }
  }
  r = [...new Set(r)];
  return r.sort();
}