哈哈哈哈哈哈哈太开心了,今天的代码耗时和内存消耗比官方少了一半哈哈
(因为官方用C#写的,我用C++,手动狗头)
题目
判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。
示例 1:
输入: 121
输出: true
示例 2:输入: -121
输出: false
解释: 从左向右读, 为 -121 。 从右向左读, 为 121- 。因此它不是一个回文数。
示例 3:输入: 10
输出: false
解释: 从右向左读, 为 01 。因此它不是一个回文数。
思路
- 负数肯定不可能
- 个位数可以
- 这种末尾是0的也不行:10,120,130
- 偶数反转:1221,只要证明21,反过来是12,即可,相当于只证明一半
- 奇数反转:121,也是证明21,反过来是12就行,只是中间的2多算了下
自己代码
自己根据官方想法写的C++
1 class Solution { 2 public: 3 bool isPalindrome(int x) {
//5,6,7行可以合并
//合并为下面的官方代码所示
//原因在于0%10==0
//所以官方代码排除了0%10也=0的情况 4 int a = 0; 5 if (x == 0) 6 return true; 7 else if (x < 0 || x % 10 == 0) 8 return false; 9 while(x > a){ 10 a = a * 10 + x % 10; 11 x/=10; 12 }
//若是偶数的话,则x==a
//若是奇数的话,此时x=1,a=12,因为中间都是2重复,所以把2给去掉,就是a/10
//最后x==a或x==a/10的话,说明是true
13 return x == a || x == a / 10; 14 } 15 };
官方代码
C#
1 public class Solution { 2 public bool IsPalindrome(int x) { 3 // 特殊情况: 4 // 如上所述,当 x < 0 时,x 不是回文数。 5 // 同样地,如果数字的最后一位是 0,为了使该数字为回文, 6 // 则其第一位数字也应该是 0 7 // 只有 0 满足这一属性 8 if(x < 0 || (x % 10 == 0 && x != 0)) { 9 return false; 10 } 11 12 int revertedNumber = 0; 13 while(x > revertedNumber) { 14 revertedNumber = revertedNumber * 10 + x % 10; 15 x /= 10; 16 } 17 18 // 当数字长度为奇数时,我们可以通过 revertedNumber/10 去除处于中位的数字。 19 // 例如,当输入为 12321 时,在 while 循环的末尾我们可以得到 x = 12,revertedNumber = 123, 20 // 由于处于中位的数字不影响回文(它总是与自己相等),所以我们可以简单地将其去除。 21 return x == revertedNumber || x == revertedNumber/10; 22 } 23 }
还可以用字符串写法, 改天再写吧
哇,现在还是没完成今天写3道题,相当于今天还有两道没完成,等到明天又是要写三道题5555