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. Я не знаю, почему я терплю неудачу в этих спецификациях. Есть ли проблема с моим кодом или есть ли способ улучшить мой код?


person Tae    schedule 22.11.2016    source источник


Ответы (4)


Я предлагаю изменить циклы 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; }

person Nina Scholz    schedule 22.11.2016

Не то чтобы вы должны были просить решения ката на Stack Overflow, но, поскольку вы уже почти закончили, вот мои идеи.

Во-первых, когда вы не уверены, почему не удалось завершить окончательные тесты, используйте console.log() и посмотрите на проверяемые значения и, возможно, даже на ожидаемые результаты (зависит от того, как написан ката).

Во-вторых, ваше решение не работает, потому что вы включаете двойники/дубликаты в свой окончательный ответ.

В настоящее время я использую наборы, чтобы избавиться от дубликатов в коде JS. Наборы включают в себя только уникальные значения и это действительно круто. Если вы добавите следующие три строки вместо текущего возврата в свой код, он должен пройти все тесты:

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

Да, я конвертирую массив в набор, чтобы избавиться от дубликатов, а затем обратно в массив. Это можно сделать многими другими способами, но наборы — отличный инструмент, поэтому вот мое предложение.

person Katia Punter    schedule 19.12.2017

Вам нужно использовать .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();
}
person DonnaTelloo    schedule 09.03.2019

person    schedule
comment
Пожалуйста, добавьте пояснение к вашему решению - person cske; 03.11.2018
comment
let arr = arrB.join() // преобразует их arrB в строку, разделенную затем я фильтрую arrA, содержащую искомые слова. если строка или элемент внутри arrA также находится внутри (строка arr, разделенная ) и элемент не является неопределенным, добавьте его в новый список, созданный методом фильтра. - person Nenoj; 04.11.2018
comment
Вы можете отредактировать свой ответ. Ваше решение не работает, если поиск содержит " ". Пример: ["a b","c d"] ["b c"] "b c" ложноположительный результат. - person cske; 04.11.2018
comment
Хороший улов! Я считаю, что мне нужно изменить javascript arrB.join(" ") на javascript arrB.join("") - person Nenoj; 13.11.2018