#javascript #arrays #loops
Вопрос:
Когда я перебираю оба массива, я получаю пропуск по большинству тестов. Один из тестов создает проблему, поскольку цикл nest продолжается против первого цикла, даже если соответствующий элемент удален.
Вход: s1: «abca» s2: «xyzbac»
Вот мой код:
function commonCharacterCount(s1, s2) {
const arrayOne = s1.split("")
const arrayTwo = s2.split("")
var matches = [];
for (let i = 0; i < arrayOne.length; i ) {
for (let j = 0; j < arrayTwo.length; j ) {
console.log(arrayTwo[j],arrayOne[i], matches)
if (arrayOne[i] === arrayTwo[j]) {
matches.push(arrayOne[i])
arrayOne.splice(arrayOne[i], 1)
}
}
}
return matches.length
}
Я проверил журнал консоли в тесте 3, который является единственным, который терпит неудачу, и я вижу, что есть проблема, пропускающая второй пункт «b».
Ответ №1:
Поскольку вы разрезаете arrayOne, вы удаляете элемент из arrayOne, и это означает, что он пропустит элемент, потому что переменная i увеличивается на 1, но arrayOne теряет элемент. Итак, вы получаете что-то вроде этого.
arrayOne = ["a","b","c","d"]
i = 0
arrayOne[i] results to "a"
теперь вы находите совпадение с arrayTwo и срезаете arrayOne по индексу i вашего совпадения, так что arrayOne становится
arrayOne = ["b","c","d"]
//however you still increment i by one so i becomes
i = 1
//so now arrayOne[i] becomes
arrayOne[i] results to "c"
Теперь я не уверен, что мое объяснение подходит, но у меня есть два решения. 1 не соединяется, а другой соединяется, но когда он это делает, он уменьшает i на единицу.
вариант 1
function commonCharacterCount(s1, s2) {
const arrayOne = s1.split("")
const arrayTwo = s2.split("")
var matches = [];
for (let i = 0; i < arrayOne.length; i ) {
for (let j = 0; j < arrayTwo.length; j ) {
console.log(arrayTwo[j],arrayOne[i], matches)
if (arrayOne[i] === arrayTwo[j]) {
matches.push(arrayOne[i])
}
}
}
return matches.length
}
вариант 2
function commonCharacterCount(s1, s2) {
const arrayOne = s1.split("")
const arrayTwo = s2.split("")
var matches = [];
for (let i = 0; i < arrayOne.length; i ) {
for (let j = 0; j < arrayTwo.length; j ) {
console.log(arrayTwo[j],arrayOne[i], matches)
if (arrayOne[i] === arrayTwo[j]) {
matches.push(arrayOne[i])
arrayOne.splice(arrayOne[i], 1)
i--
}
}
}
return matches.length
}