Skip to content

算法:回文数

轩辕十四
Published date:

Table of contents

Open Table of contents

题目

给你一个整数 x ,如果 x 是一个回文整数,返回 true ;否则,返回 false

回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。

示例 1:

输入:x = 121
输出:true

示例 2:

输入:x = -121
输出:false
解释:从左向右读, 为 -121 。 从右向左读, 为 121- 。因此它不是一个回文数。

示例 3:

输入:x = 10
输出:false
解释:从右向左读, 为 01 。因此它不是一个回文数。

提示:

**进阶:**你能不将整数转为字符串来解决这个问题吗?

解法

func isPalindrome(_ x: Int) -> Bool {
  if x < 0 || (x != 0 && x % 10 == 0) {
    return false
  }
  
  var p = x
  var n = 0
  while p > n {
    n = n * 10 + p % 10
    p /= 10
  }
  
  return n == p || n / 10 == p
}

我们来详细分析一下这个算法的每个步骤:

1. 排除负数和尾部为零的情况

if x < 0 || (x != 0 && x % 10 == 0) {
  return false
}

因此,首先排除负数和尾部为零的非零数字。

2. 初始化变量

var p = x
var n = 0

3. 反转数字的后半部分

while p > n {
  n = n * 10 + p % 10
  p /= 10
}

通过这个过程,n 将逐渐成为 x 的后半部分的反转,p 将逐渐成为 x 的前半部分。

4. 判断回文条件

return n == p || n / 10 == p

举个例子:

总结:

Previous
算法:删除链表的倒数第 N 个结点
Next
算法:无重复字符的最长子串