2

我目前正在尝试在 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

4 回答 4

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; }

于 2016-11-22T17:36:48.120 回答
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();
}
于 2019-03-09T20:59:59.470 回答
0
function inArray(arrA, arrB){
  let arr = arrB.join(" ")
  return arrA.filter(item => arr.search(item) !== -1 && item !== undefined ).sort()

}
于 2018-11-03T08:04:28.637 回答
0

并不是说您应该在 Stack Overflow 上寻求解决 kata 的方法,但既然您快到了,这就是我的想法。

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

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

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

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

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

于 2017-12-19T21:12:01.403 回答