我正在处理LeetCode上的一个问题,该问题询问以下问题:在不将整数转换为字符串的情况下确定整数是否是回文。我能够提出自己的算法来确定回文,但是如果不将整数转换为字符串就无法提出。所以我在Internet上遇到了以下代码:
public boolean isPalindrome(int x) {
if (x < 0)
return false;
// initialize how many zeros
int div = 1;
while (x / div >= 10) {
div = div * 10;
}
while (x != 0) {
int left = x / div;
int right = x % 10;
if (left != right)
return false;
x = (x % div) / 10;
div = div / 100;
}
return true;
}
我多次浏览代码以查看代码的作用,但是我很难理解这个人如何提出这种逻辑。现在,我知道除法和取模的工作原理。但是,这部分很模糊:
// initialize how many zeros
int div = 1;
while (x / div >= 10) {
div = div * 10;
}
我相信这个人正在尝试确定小数位?
他们代码的下一个片段部分,我完全困惑于他们如何提出这一点。我的意思是……这是一些简单的数学技巧,显然我没有给出解释吗?简单来说,他们在这里做什么?他们如何确定10和100的除数?
x = (x % div) / 10;
div = div / 100;
我感谢您提供任何有助于我理解的解释。预先感谢。
v / r,
艾伦
答案 0 :(得分:2)
让我们以x = 12321
然后
int div = 1;
while (x / div >= 10) {
div = div * 10;
}
上方部分使div = 10000,
然后这部分使left = 1和right = 1,然后比较left和right
int left = x / div;
int right = x % 10;
然后,当我们遍及此部分
x = (x % div) / 10;
div = div / 100;
发生这种情况
x = (12321%10000)/10 = (2321)/10 = 232
它们使用div取模,以除去第一位,然后除以10以除去最后一位。因为已经比较过第一位和最后一位数字,所以将其删除。 div除以100,是因为我们一次从“ x”中删除了两位数字...第一位和最后一位。
now, x = 232
这部分使left = 2和right = 2,并再次比较left和right
int left = x / div;
int right = x % 10;
然后,当我们遍历此部分
x = (x % div) / 10;
div = div / 100;
发生这种情况
x = (232%100)/10 = (32)/10 = 3
此后,left = 3和right = 3,它们匹配,返回“ true”,循环结束。
答案 1 :(得分:1)
private static boolean isPalindrome(int number) {
int temp = number;
int result = 0;
while (temp != 0) {
result = result * 10 + temp % 10;
temp /= 10;
}
return number == result;
}