题目
反转 一个整数意味着倒置它的所有位。
例如,反转 2021 得到 1202 。反转 12300 得到 321 ,不保留前导零 。
给你一个整数 num ,反转 num 得到 reversed1 ,接着反转 reversed1 得到 reversed2 。如果 reversed2 等于 num ,返回 true ;否则,返回 false 。
示例 1:
输入:num = 526
输出:true
解释:反转 num 得到 625 ,接着反转 625 得到 526 ,等于 num 。
示例 2:
输入:num = 1800
输出:false
解释:反转 num 得到 81 ,接着反转 81 得到 18 ,不等于 num 。
示例 3:
输入:num = 0
输出:true
解释:反转 num 得到 0 ,接着反转 0 得到 0 ,等于 num 。
提示:
0 <= num <= 106
题解一 真翻转两次,list作为中间存储
public static boolean isSameAfterReversals(int num) {
// 定义list存储拆分的数字
List<Integer> list = new ArrayList<>();
int tmp = num;
// 拆分数字
while (tmp > 0) {
int a = tmp % 10;
list.add(a);
tmp /= 10;
}
// 34023 {3,2,0,4,3}
// 第一次翻转
int total1 = 0; // 32043
for (Integer i : list) {
total1 = total1 * 10 + i;
}
// 第二次翻转
tmp = total1;
list.clear();
while (tmp > 0) {
int a = tmp % 10;
list.add(a);
tmp /= 10;
}
int total2 = 0;
for (Integer i : list) {
total2 = total2 * 10 + i;
}
if (total2 == num) {
return true;
}else{
return false;
}
}
题解二 真翻转两次
public boolean isSameAfterReversals(int num) {
int tmp = num;
// 一次翻转
int total1 = 0;
while (tmp > 0) {
int a = tmp % 10;
total1 = total1 * 10 + a;
tmp /= 10;
}
// 第二次翻转
int total2 = 0;
tmp = total1;
while (tmp > 0) {
int a = tmp % 10;
total2 = total2 * 10 + a;
tmp /= 10;
}
if (total2 == num) {
return true;
}else{
return false;
}
}
题解三 数学逻辑(官方提供)
提示 111
一个数字进行两次反转操作不变的充要条件为:在两次反转操作前后数字的位数均不变。
提示 111 解释
首先考虑充分性。如果操作前后位数不变,则反转操作等价于数字对应的十进制字符串的反转操作,而字符串反转两次一定等于本身,因此该数字反转两次也为本身。
其次考虑必要性。对于一个数进行反转操作,它的位数一定不会增加。因此进行两次反转操作后得到的数仍然等于原数,操作过程中必须保证数字位数不变。
思路与算法
根据 提示 111 以及取值范围,我们需要找出两次反转操作前后数字位数均不变的(正)整数。
对于 000,进行两次反转操作后仍然为 000。
考虑任意非零正整数,由于反转操作前后均不保留前导零,因此:
对于第一次反转操作,位数不变的充要条件即为该整数结尾不含 000;
对于第二次反转操作,由于第一次操作前的整数不含前导零,因此第二次操作前的整数结尾也不含 000,第二次操作前后位数不会改变。
综上,非负整数进行两次反转操作不变的充要条件即为:*该整数为 000 或该整数结尾不含 000。而后者等价于该数模 101010 的余数不为 000。我们按照该条件判断并相应返回结果即可。*
class Solution {
public boolean isSameAfterReversals(int num) {
return num == 0 || num % 10 != 0;
}
}