JavaScript 한 줄로 회문 문제를 해결하는 방법

지금 막 코딩하는 방법을 배우는 것이 아니라면 유명한 유효 회문 또는 '회문입니다' 문제에 대해 들어봤을 것입니다. 일반적인 기술 면접 질문입니다.

JavaScript의 한 줄로 회문 문제를 해결하여 면접관의 부담을 덜어주는 방법을 보여드리겠습니다. 😎



복습: 회문 문제란 무엇입니까?



문자열은 팰린드롬(palindrome)입니다. 모든 문자의 순서를 반대로 한 후에도 같은 문자열을 얻게 됩니다. const str = 'abba'는 회문이고 const str = 'abc'는 아닙니다.

문제는 다음과 같습니다. 유효한 문자열이 주어지면 문자열이 유효한 회문인지 확인하는 함수를 구성할 수 있습니까? 있으면 true를 반환하고 그렇지 않으면 false를 반환합니다.

IsPalindrome(...) 한 줄에




const isPalindrome = (str, first = 0, last = str.length - 1) => 
  (first > last) ? 
    true : 
    (str[first] === str[last]) && isPalindrome(str, first + 1, last - 1);



예, 이것은 한 줄의 JavaScript 코드입니다. 읽기 쉽도록 줄 바꿈과 탭을 몇 개 추가했습니다.

위 함수가 부담스러워 보이더라도 걱정하지 마세요. 모든 JavaScript와 재귀 Jui Jitsu를 함께 살펴볼 것입니다. 😅

시작하자...

화살표 기능



JavaScript 화살표 함수를 사용하고 있으므로 제거return하고 화살표 함수가 제공하는 암시적 반환 기능을 활용할 수 있습니다. 사랑 화살표 기능! 😍

const isPalindrome = (str, first = 0, last = str.length - 1) => 


함수 인수의 기본값



함수 인수에서 바로 2개의 포인터를 초기화했습니다: first = 0last = str.length - 1 . 매우 시원하고 편리합니다.

삼항 연산자




  (first > last) ? 
    true : 
    (str[first] === str[last]) && isPalindrome(str, first + 1, last - 1);


삼항 조건 연산자는 if {...} else {...} 문장을 한 줄로 압축한 것입니다. 다음은 간단한 예입니다.

(x > 0) ? 
console.log('x is greater than zero') : 
console.log('x is less than or equal to zero');


마지막으로 모두가 좋아하는 것: 재귀!




(str[first] === str[last]) && isPalindrome(str, first + 1, last - 1);


다행스럽게도 이것은 간단한 재귀 응용 프로그램이므로 이해하려고 노력하는 사람에게 골칫거리가 되지 않습니다. 🤯

위의 명령문에서: (str[first] === str[last])는 문자열의 첫 번째 문자와 마지막 문자가 일치하는지 확인합니다. * 그런 다음isPalindrome(str, first + 1, last - 1)는 문자열의 두 번째와 마지막에서 두 번째 문자가 일치하는지 재귀적으로 확인합니다.*

예: str = abcba 에서 isPalindrome(str) 까지 실행하고 최종 return 문을 확장하면(각 재귀 반복을 실행한 후) 다음과 같이 표시됩니다.

(str[0] === str[4]) && (str[1] === str[3]) && (str[2] === str[2]) && true

isPalindrome(str)str[0]str[4] (a vs a)로 시작하는 각 요소 쌍을 확인하고 마지막으로 str[2]일 때 자신에 대해 first === last를 확인합니다.

끝에 있는 true 문은 when first > last 에 첨부되어 마지막 재귀 함수 호출을 완료합니다.

기다리다! 공백, 대문자 및 이상한 문자를 처리해야 하는 경우 어떻게 해야 합니까??



예, this leetcode version과 같은 일부 Palindrome 문제에서는 공백, 특수 문자 및 제거하거나 어떻게든 처리해야 하는 다른 경우가 있는 문자열이 있습니다.

걱정하지 마세요. 소문자만 포함하도록 문자열을 정리하는 1줄 수정이 있습니다. 실행하기 전에 다음을 실행하십시오isPalindrome(str).

str = str.match(/[a-z]/gi).join('').toLowerCase();


또는 내가 약속한 것처럼 isPalindrome을 한 ​​줄로 유지할 수 있습니다.

const isPalindrome = (str = str.match(/[a-z]/gi).join('').toLowerCase(), first = 0, last = str.length - 1) => 
  (first > last) ? 
    true : 
    (str[first] === str[last]) && isPalindrome(str, first + 1, last - 1);



좋은 웹페이지 즐겨찾기