我目前正在尝试使用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个规格。 我不知道为什么我失败了这些规格。 我的代码有问题,还是有什么方法可以让我的代码更好?
答案 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();
}