Codewars: что в? лексикографический порядок (Javascript)
В настоящее время я пытаюсь решить вопрос ниже в Codewars в JavaScript. Ниже вопрос:
"Учитывая два массива строк a1 и a2, возвращают отсортированный массив r в лексикографическом порядке строк a1, которые являются подстроками строк 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), [])
Мой код, кажется, прошел все тесты, приведенные в качестве примера, но я не смог пройти все спецификации. Это говорит о том, что я провалил 5 спецификаций из 10. Я не знаю, почему я отказываюсь от этих спецификаций. Есть ли проблема с моим кодом или я могу улучшить свой код?
3 ответа
Вам нужно использовать.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();
}
function inArray(arrA, arrB){
let arr = arrB.join(" ")
return arrA.filter(item => arr.search(item) !== -1 && item !== undefined ).sort()
}
Не то чтобы вам нужно было искать решение для ката по переполнению стека, но поскольку вы почти у цели, вот мои идеи.
Во-первых, если вы не уверены, почему не удается выполнить финальные тесты, используйте console.log() и посмотрите на значения, которые тестируются, и, возможно, даже на ожидаемые результаты (зависит от способа написания ката).
Во-вторых, ваше решение не работает, потому что вы включаете дубликаты / дубликаты в свой окончательный ответ.
В настоящее время я использую наборы, чтобы избавиться от дубликатов в коде JS. Наборы включают только уникальные значения и действительно крутые. Если вы добавите следующие три строки вместо текущего возврата в ваш код, он должен пройти все тесты:
var setOfRes = new Set(newResult.sort());
var array = Array.from(setOfRes);
return array;
Да, я конвертирую из массива в набор, чтобы избавиться от дубликатов, а затем снова в массив. Это можно сделать многими другими способами, но наборы - отличный инструмент, так что вот мое предложение.
Я предлагаю изменить циклы 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; }