[알고리즘 문제 해결] LeetCode 9. 회문 번호

이야기

정수가 회문인지 확인합니다. 회문 번호는 양의 순서 (왼쪽에서 오른쪽으로)와 역순 (오른쪽에서 왼쪽으로) 모두에서 동일한 정수를 나타냅니다.
고급 :
정수를 문자열로 변환하지 않고이 문제를 해결할 수 있습니까?

해결책 1

문자열로 변환하여 회문 문자열인지 확인합니다.

class Solution {
    public boolean isPalindrome(int x) {
        if(x < 0) {
            return false;
        }
        String str = String.valueOf(x);
        int length = str.length();
        for(int i = 0; i < length / 2; i++) {
            if(str.charAt(i) != str.charAt(length - 1 - i)) {
                return false;
            }
        }
        return true;
    }
}

해결 방법 2

숫자의 각 자릿수를 분해하여 배열로 변환 한 다음 판단합니다.

class Solution {
    public boolean isPalindrome(int x) {
        if(x < 0) {
            return false;
        }
        int[] digit = new int[10];
        int i = 0;
        while(x > 0) {
            digit[i++] = x % 10;
            x = x / 10;
        }
        for(int j = 0; j < i / 2; j++) {
            if(digit[j] != digit[i - 1 - j]) {
                return false;
            }
        }
        return true;
    }
}

솔루션 3은 비교를 위해 숫자의 절반 만 뒤집습니다.

처음 두 방법은 변환 문자열을 사용하고 추가 배열을 사용합니다. 사실 더 나은 해결책이 있습니다. 숫자의 마지막 절반 만 반전 할 수 있으며 반전 후 전반부와 일치하면 회문 번호임을 의미합니다.

우리 모두 알다시피, 10으로 나누기 + 10으로 나누기의 나머지를 사용하여 마지막 숫자를 얻을 수 있습니다. 그렇다면 숫자의 절반이 변환되었음을 어떻게 판단할까요? 실제로 변환 과정에서 결과 숫자는 지속적으로 커지지 만 원래 숫자는 지속적으로 작아집니다. 원래 숫자가 결과 숫자보다 작거나 같으면 반 또는 반 더하기 1이 변환됨을 의미합니다 (홀수 자릿수의 경우).

주목해야 할 또 다른 사항은 위에서 언급 한 번호를 반전시키는 과정입니다. 10의 배수는 불필요하며 (10의 배수는 0을 제외한 회문 번호가 아님) 마지막 단계에서 홀수를 특수 처리 할 때 실수하기 쉽습니다. 따라서 10의 배수는 음수와 같은 특수한 경우로 처리 될 수 있습니다.

class Solution {
    public boolean isPalindrome(int x) {
        if(x < 0 || (x % 10 == 0 && x != 0)) {
            return false;
        }

        int revert = 0;
        while(x > revert) {
            revert = revert * 10 + x % 10;
            x = x / 10;
        }

        return (revert == x) || (revert / 10 == x);
    }
}

추천

출처blog.csdn.net/vxzhg/article/details/106673516