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