描述:判断一个整数是否是回文数,回文数是指正序(从左往右)和倒序(从右往左)读都是一样的整数

例1:输入:121

          输出:true

例2:输入:-121

          输出:false

           解释:从左往右读 为 -121,从右往左读 为 121-,所以不是一个回文数

例3:输入:10

           输出:false

           解释:从右往左读 为 01,不是一个回文数

 

解法一:利用字符串

思路:将整数转换为字符串,然后将字符串反转,并判断反转后的字符串是否与原字符串相等,相等则是回文数,反之不是

具体实现:

//判断一个整数是否是回文数(从左往右读 == 从右往左读)
func isPalindrome(_ x: Int) -> Bool {
        var original = String(x)
        var new : String! = ""
        for c in original {
            new = String(c) + new
        }

        if  new == original {
            return true
        }else {
            return false
        }
}

 

进阶:不用字符串方式解决

解法二:反转整个整数

思路:将整数全部反转,判断反转后是否与原整数一致

具体实现:

func isPalindrome(_ x: Int) -> Bool {
        
        //用反转后的整数比较
        var y = x //用y记住原始值
        var res : Int  = 0 //用于存储反转后的类型

        while y > 0 {
            res = res*10 + y%10
            y = y/10
        }
        if res == x {
            return true
        }
        return false
}

 

解法三:反转一半整数

思路:反转一半的整数,判断是否与后面位数的整数相等

如何知道反转数字的位数达到了整数的一半?

答:我们将原始数字除以 10,然后给反转后的数字乘上 10,所以,当原始数字小于反转后的数字时,就意味着我们已经处理了一半位数的数字。

具体实现:

func isPalindrome(_ x: Int) -> Bool {
        // 特殊情况:
        // 如上所述,当 x < 0 时,x 不是回文数。
        // 同样地,如果数字的最后一位是 0,为了使该数字为回文,
        // 则其第一位数字也应该是 0
        // 只有 0 满足这一属性
        if x < 0 || (x%10==0 && x != 0) {
            return false
        }
        var s = x
        var res = 0
        //我们将原始数字除以 10,然后给反转后的数字乘上 10,所以,当原始数字小于反转后的数字时,就意味着我们已经处理了一半位数的数字。
        while s > res {
            res = res*10+s%10
            s /= 10
        }

        // 当数字长度为奇数时,我们可以通过 revertedNumber/10 去除处于中位的数字。
        // 例如,当输入为 12321 时,在 while 循环的末尾我们可以得到 x = 12,revertedNumber = 123,
        // 由于处于中位的数字不影响回文(它总是与自己相等),所以我们可以简单地将其去除。
        return s==res || s==res/10
    }