Как я могу исправить свой код, который возвращает «неопределенный» в двух конкретных массивах? - PullRequest
0 голосов
/ 03 февраля 2019

Я новичок в JavaScript и в настоящее время тренируюсь в Code Wars, и у меня есть некоторые проблемы с моим кодом здесь.У меня есть задача найти число в данном массиве, которое отличается от других чисел в том же массиве.Когда я запускаю тесты только для этих двух конкретных массивов, код возвращает «неопределенный».Итак, я хотел знать, почему и как мне улучшить мой код?Может быть, я что-то пропустил.Благодарим вас за помощь.

Вот мой код:

function findUniq(arr) {
  for (let i = 0; i < arr.length; i++) {
    if (arr[i] !== arr[0]  && arr[i] !== arr.slice(-1)[0]) {
      return arr[i]; 
    } 
  }
}

Итак, у меня есть эти два массива:

findUniq([0, 1, 1, 1, 1, 1, 1, 1]); ожидается 0, но возвращается undefined.

findUniq([8, 8, 8, 8, 8, 8, 8, 7]); ожидается 7, также возвращается undefined.

Ответы [ 4 ]

0 голосов
/ 03 февраля 2019
 function findUniq(arr) {
  for (let i = 0; i < arr.length; i++) {
    if (arr[i] !== arr[arr.length - (i-1)] && arr[i] !== arr[arr.length + (i-1)] && arr[i] !== arr[i+1] && arr[i] !== arr[i-1]) {
     return arr[i]; 
    } 
  }
}

Хорошо, вот мой собственный ответ, спасибо всем, я приму к сведению всех ваших критиков, чтобы улучшить. Спасибо Джонасу Уилмсу:)

0 голосов
/ 03 февраля 2019

Для каждого элемента в массиве, который вы проверяете, он не равен первым и последней позиции:

 //❌                    ✔️
 //?                    ?
   [0, 1, 1, 1, 1, 1, 1, 1]
 //⬆️

Теперь для первого элемента (который нужно найти),сравнение с последним элементом приведет к «неравному», потому что 0 не равно 1, но проверка первого приведет к «равному» при сравнении элемента с самим элементом.


Чтобы он обнаружил первый и последний элемент, не проверяйте, не равняется ли он первому и последнему, но если он не равен предыдущему и следующему, затем переходите к концу илиначинается, когда индекс покидает массив.

Через это он также работает для последнего и первого элемента:

 //   ✔️                 ✔️
 //   ?                 ?
   [0, 1, 1, 1, 1, 1, 1, 1]
 //⬆️
0 голосов
/ 03 февраля 2019

Возможно, самый простой способ, как предложил Джонас Уилмс, найти первый, который не равен как своему предшественнику, так и его преемнику, обернувшись в конце списка:

const findUnique = arr => arr.find((n, i, a) => 
  n !== a[(i - 1) % arr.length] && n !== a[(i + 1 % arr.length)]
)

console.log(findUnique([1, 1, 3, 1, 1, 1, 1, 1])) //~> 3
console.log(findUnique([0, 1, 1, 1, 1, 1, 1, 1])) //~> 0
console.log(findUnique([8, 8, 8, 8, 8, 8, 8, 7])) //~> 7

Обратите внимание, что для обработки соскальзывания с конца списка используется оператор %, остаток или модуль Javascript.

0 голосов
/ 03 февраля 2019

Вы также можете использовать сокращение до клубных цифр в качестве пары ключ-значение, а затем найти ключ со значением 1

function findUniq(input){
  let op = input.reduce((op,inp)=>{
    if(op[inp]){
      op[inp]++;
    } else {
      op[inp] = 1
    }
    return op
  },{})
  return Object.keys(op).find(e=> op[e] === 1)
}

console.log(findUniq([0, 1, 1, 1, 1, 1, 1, 1]))
console.log(findUniq([8, 8, 8, 8, 8, 8, 8, 7]))
...