2016-11-22 5 views
2

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

ответ

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

0

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

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

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

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

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

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