[LeetCode-Golang] 9. 回文数
题目
判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。
示例 1:
输入: 121
输出: true
示例 2:
输入: -121
输出: false
解释: 从左向右读, 为 -121 。 从右向左读, 为 121- 。因此它不是一个回文数。
示例 3:
输入: 10
输出: false
解释: 从右向左读, 为 01 。因此它不是一个回文数。
进阶:
你能不将整数转为字符串来解决这个问题吗?
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/palindrome-number
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解题思路
1.首先判断特殊情况,易得x==0为true,x<0为false。
2.对于正整数x,可以反转一半的数字得到rev,如abcde反转一半为edc,比较edc/10与ab是否相等;如abcdef反转一半为fed,比较fed与abc是否相等。即判断x == rev || x == rev / 10
与数字完全反转相比,反转一半数字的好处是省时间+防溢出。
3.特别需要注意x!=0 && x%10==0,如x=10时,反转一半的数字得到rev=0,x=1/10=0,x==rev所以在反转一半的正整数之前,要处理这种特殊情况。
复杂度分析
时间复杂度:O(log10(n))
空间复杂度:O(1)
代码
func isPalindrome(x int) bool { // x = 0为true if x == 0{ return true } // x < 0因为存在负号,为false。特别注意的是110 if x < 0 || x % 10 == 0{ return false } // 下面判断x > 0的情况 // 可以反转一半的数字,如12321,反转一半得到123,将123/10与12比较;如123321,反转一半得到123,将123与123比较 // 当x > rev进入循环,x == rev || x == rev / 10时,return true rev := 0 for x > rev{ rev = rev*10 + x%10 x /= 10 } if x == rev || x == rev / 10 { return true } return false }
执行结果
执行用时 :8 ms, 在所有 Go 提交中击败了98.25% 的用户
内存消耗 :5.2 MB, 在所有 Go 提交中击败了72.21%的用户