Python3实现回文数判断与罗马数字转整数算法详解

Luna
Luna
发布时间:2026-10-13 | 2人浏览过
原创

本文详细介绍Python3中判断整数是否为回文数及将罗马数字转换为整数的两种算法。通过字符串反转、数学取余及字典映射等方法,提供完整代码示例与复杂度优化思路,帮助开发者掌握基础算法逻辑与边界条件处理。

本文通过Python3代码实例,详细讲解如何判断一个整数是否为回文数,以及如何将罗马数字转换为整数的算法实现。内容包含多种解题思路及代码示例,供读者参考学习。

回文数判定算法

回文数判定

核心任务是判断给定的整数是否为回文数。所谓回文数,即该整数从左向右读取的顺序与从右向左读取的顺序完全一致。

示例 1: 输入: 121 输出: true

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

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

进阶挑战:尝试在不将整数转换为字符串的前提下解决此问题。

方法一:利用字符串转换与反转进行比较

方法一:字符串转换法


class Solution:
  def isPalindrome(self, x):
    """
    :type x: int
    :rtype: bool
    """
    if x < 0:
      return False #如果x是负数,则肯定不是回文数。
    str_x_r = ''
    str_x = str(x)
    str_x_r += str_x[::-1] #反转字符串,-1表示从右边读取
    if str_x_r == str_x:
      return True
    else:
      return False

方法二:通过数学运算反转整数

方法二:整数反转法


class Solution:
  def isPalindrome(self, x):
    """
    :type x: int
    :rtype: bool
    """
    if x < 0:
      return False
    tmp = x
    rev = 0
    while x != 0:
      pop = x % 10
      x //= 10
      rev = rev*10 + pop
    if tmp == rev:
      return True
    else:
      return False

注意:尽管题目未明确要求,但在实现方法二时仍需考虑整数溢出的潜在风险,具体处理可参考整数反转的相关问题。

方法二的改进策略:仅反转整数的后一半数字,并将其与前一半进行比较,从而避免溢出问题。其反转逻辑与方法二相同,关键在于如何判断反转位数已达到原数的一半。判断依据如下:

当剩余未处理的数字小于或等于已反转的数字时,表明已经处理完了一半的位数。

例如,对于数字 1221,反转后 x=12,rnum=12,两者相等;对于 12321,反转后 x=12,rnum=123,此时反转的数字比剩余数字多一位,说明已反转了一半加一位,比较时需忽略多余的那一位。

优化方案:半整数反转


class Solution:
  def isPalindrome(self, x):
    """
    :type x: int
    :rtype: bool
    """
    #如果是负数或 被10整除的非零数,肯定不是回文数
    if x<0 or (x%10 == 0 and x != 0):
      return False
    rnum = 0
    while x > rnum:
      rnum = rnum*10 + x%10
      x //= 10
    return x == rnum or x == rnum//10

罗马数字转整数算法

罗马数字转整数算法

罗马数字由以下七种字符构成:I,V,X,L,C,D 和 M。

字符 数值
I 1
V 5
X 10
L 50
C 100
D 500
M 1000

例如,罗马数字 2 写作 II,即两个 1 并列。12 写作 XII,即 X + II。27 写作 XXVII,即 XX + V + II。

通常情况下,罗马数字中较小的数字位于较大的数字右侧。但存在特例,例如 4 不写作 IIII,而是 IV。数字 1 位于数字 5 左侧时,表示大数减小数的结果 4。同理,数字 9 表示为 IX。该特殊规则仅适用于以下六种情况:

  • I 可以放在 V (5) 和 X (10) 的左边,来表示 4 和 9。
  • X 可以放在 L (50) 和 C (100) 的左边,来表示 40 和 90。
  • C 可以放在 D (500) 和 M (1000) 的左边,来表示 400 和 900。

给定一个罗马数字字符串,将其转换为整数。输入保证在 1 到 3999 的范围内。

示例 1: 输入: “III” 输出: 3

示例 2: 输入: “IV” 输出: 4

示例 3: 输入: “IX” 输出: 9

示例 4: 输入: “LVIII” 输出: 58 解释: L = 50, V= 5, III = 3.

示例 5: 输入: “MCMXCIV” 输出: 1994 解释: M = 1000, CM = 900, XC = 90, IV = 4.

将七个字符及其对应数值存入字典中,可显著提升查询效率,相比使用 if 条件判断语句速度更快。

字典映射实现法


class Solution:
  def romanToInt(self, s):
    """
    :type s: str
    :rtype: int
    """
    #巧妙利用了字典
    roman_dict = {
      'I':1,
      'V':5,
      'X':10,
      'L':50,
      'C':100,
      'D':500,
      'M':1000,
      }
    result = 0
    for i in range(len(s)):
      if i < len(s)-1 and roman_dict[s[i]] < roman_dict[s[i+1]]:
        result -= roman_dict[s[i]]
      else:
        result += roman_dict[s[i]]
    return result

更多关于Python相关内容感兴趣的读者可查看本站专题:《Python数学运算技巧总结》、《Python数据结构与算法教程》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》及《Python入门与进阶经典教程》

希望本文所述的算法实现与解析对读者的Python程序设计有所帮助。

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表