[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%的用户
posted @ 2020-03-16 01:54  世界边境  阅读(161)  评论(0编辑  收藏  举报