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

Другие вопросы по тегам