9. Palindrome Number (easy)
题目要求:检查给定的数字是否是回文数字
我的做法:把每个数字都存起来,然后首尾比较,从两头一直比到中间,这样做可以防止溢出(事实上没必要考虑溢出,因为对于正数来说,溢出后就是负数了,肯定不相等),时间复杂度和空间复杂度都是O(n),虽然AC了,但显然不合适.我的做法其实就是把数字分成两部分去比较这两部分是否相同,分成两部分去比较有个更好的方式,见第二个代码.
最优解:第二个代码和第三个代码,首推第二个
心得:要清楚循环每一轮都做的是什么,循环条件发生了什么改变
我的做法
//我的做法
public static boolean isPalindrome(int x) {
if (x < 0) return false;
if (x < 10) return true;
int len = String.valueOf(x).length();
int[] each = new int[len];
for (int i = 0; i < len; i++) {
each[i] = x % 10;
x = x / 10;
}
for (int i = 0; i < len / 2; i++) {
if (each[i] != each[len - 1 - i]) return false;
}
return true;
}
首推的最优解
- 改进的half converse:只翻转一半的话,很明显要考虑数字的位数是奇数还是偶数:偶数的话,两部分长度相同;奇数的话,两部长度差1
- while(x>res)
- return (x == res || x == res / 10); return的左边针对偶数情况,右边针对奇数情况
- 清楚每一轮循环做什么,循环条件如何改变
- complexity analysis:
- time complexity: O(n/2),n指数字长度
- space comlexity: O(1)
// 考虑溢出,只旋转一半
public boolean isPalindrome(int x) {
if (x<0) return false;
int res = 0;
// 对于奇数 三位数肯定比两位数大
// 对于偶数 正好翻转一半后跳出循环,比如1221,11
// 对于偶数,如果是1211
// 最重要的就是这个循环条件
// 偶数的情况过一遍1221,1211,1231
// 奇数的情况过一遍121,122
while (x>res){
res = res*10 + x%10;
x = x/10;
}
// 这个return考虑11,222;121,23432奇偶两种情况
return (x==res || x==res/10);
}
最优解
- 无需考虑溢出,因为对于正数来说,溢出后就是负数了,肯定不相等
(负数溢出后是正数,这里不需要考虑)
要利用的信息就是:溢出后与溢出前符号相反,肯定不等!
思路:将数字完全翻转,与原数字比较即可,需要提供一个变量存储原数字 - complexity analysis:
- time complexity: O(n)
- space complexity: O(1)
public boolean isPalindrome(int x) {
if(x < 0) return false;
int y = x;
int res = 0;
while(y != 0) {
res = res * 10 + y % 10;
y /= 10;
}
return x == res;
}