>웹 프론트엔드 >JS 튜토리얼 >Codewars - 패리티 이상치 찾기

Codewars - 패리티 이상치 찾기

Mary-Kate Olsen
Mary-Kate Olsen원래의
2025-01-05 19:30:47727검색

안녕하세요.

Codewars - Find The Parity Outlier

이번 시리즈에서는 Codewars의 도전 과제와 저의 사고 과정을 포스팅하고 있습니다. 가능할 때마다 JS와 Node 18을 사용하고 있습니다. 명확성을 위해 공정하게 사용하고 있습니다.

문제는 짝수로 가득 찬 배열에서 홀수 또는 홀수로 가득 찬 배열에서 짝수 중 하나를 찾아야 한다는 것입니다. 즉,
[0, 2, 4, 6, 8, 97, 14, 14, -2] -> 97
[ 1, 3, 2, -3, -7, 227, -183 ] -> 2


먼저 배열의 처음 3개 요소를 살펴보고 어떤 종류의 이상값이 있는지 확인하겠습니다.

  • 짝수 요소 3개 =>
    0 2(엑스imod2)=0sum_{substack{0leq ileq 2}} ( x_{i}mod 2 ) = 0 0≤i≤ 2 (x 저는 mod2)=0
  • 홀수 요소 1개 =>
    0 2(엑스imod2)=1sum_{substack{0leq ileq 2}} ( x_{i}mod 2 ) = 1 0≤i≤ 2 (x 저는 mod2)=1
  • 2개의 이상한 요소 =>
    0 2(엑스imod2)=2sum_{substack{0leq ileq 2}} ( x_{i}mod 2 ) = 2 0≤i≤ 2 (x 저는 모드2)=2
  • 3가지 이상한 요소 =>
    0 2(엑스imod2)=3sum_{substack{0leq ileq 2}} ( x_{i}mod 2 ) = 3 0≤i≤ 2 (x 저는 모드2)=3

나중에 우리가 해야 할 일은 모듈로 2가 다른 하나의 숫자에 도달할 때까지 배열을 순회하는 것입니다. 해당 알고리즘의 두 가지 변형이 그에 따라 적용됩니다.

// odd number in even array
while (number % 2 == 0 && counter < integers.length){
      number = integers[counter];
      counter++;
    }
// even number in odd array
while (number % 2 == 1 && counter < integers.length){
      number = integers[counter];
      counter++;
    }

부품을 함께 조립하면 다음과 같이 됩니다.

function findOutlier(integers){
  let counter = 0;
  let number = 0;

  let a = integers[0] % 2;
  let b = integers[1] % 2;
  let c = integers[2] % 2;


  if (a + b + c <= 1){
    number = integers[0];
    while (number % 2 == 0 && counter < integers.length){
      number = integers[counter];
      counter++;
    }
  }
  else {
    number = integers[0];
    while (number % 2 == 1 && counter < integers.length){
      number = integers[counter];
      counter++;
    }
  }
  return number;
}

테스트를 통과하지 못했을 때 제가 느낀 감정은 바로 이것이었습니다.

Codewars - Find The Parity Outlier


둘째, 무슨 일이 일어났는지 구글링해야 했어요. 나는 음수가 나타날 수 있다고 생각하지 않은 것으로 나타났습니다. 그래서 JS가 음수 모듈러스를 어떻게 처리하는지 읽어야 했습니다


세 번째 단계에서는 Math.abs()를 사용하세요.

function findOutlier(integers){
  let counter = 0;
  let number = 0;

  let a = Math.abs(integers[0] % 2);
  let b = Math.abs(integers[1] % 2);
  let c = Math.abs(integers[2] % 2);


  if (a + b + c <= 1){
    number = integers[0];
    while (Math.abs(number) % 2 == 0 && counter < integers.length){
      number = integers[counter];
      counter++;
    }
  }
  else {
    number = integers[0];
    while (Math.abs(number) % 2 == 1 && counter < integers.length){
      number = integers[counter];
      counter++;
    }
  }
  return number;
}

괜찮은 성능이지만 가독성이 좋지는 않습니다. 개선의 여지가 충분합니다.

조심하세요. 물을 마셔요???.

이전

위 내용은 Codewars - 패리티 이상치 찾기의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.