描述:判断一个整数是否是回文数,回文数是指正序(从左往右)和倒序(从右往左)读都是一样的整数
例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
}
















