Python3实现的回文数判断及罗马数字转整数算法示例


Posted in Python onMarch 27, 2019

本文实例讲述了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 的左边,所表示的数等于大数 5 减小数 1 得到的数值 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将字符串转换成数组的方法
Apr 29 Python
在Python中使用HTML模版的教程
Apr 29 Python
python 循环读取txt文档 并转换成csv的方法
Oct 26 Python
python 列表递归求和、计数、求最大元素的实例
Nov 28 Python
Python3.0中普通方法、类方法和静态方法的比较
May 03 Python
Python中的正则表达式与JSON数据交换格式
Jul 03 Python
如何用Python破解wifi密码过程详解
Jul 12 Python
python字典的setdefault的巧妙用法
Aug 07 Python
python随机生成库faker库api实例详解
Nov 28 Python
python删除某个目录文件夹的方法
May 26 Python
python IP地址转整数
Nov 20 Python
Python 解决空列表.append() 输出为None的问题
May 23 Python
详解Django项目中模板标签及模板的继承与引用(网站中快速布置广告)
Mar 27 #Python
python模块之subprocess模块级方法的使用
Mar 26 #Python
详解Python数据可视化编程 - 词云生成并保存(jieba+WordCloud)
Mar 26 #Python
Python实现的矩阵转置与矩阵相乘运算示例
Mar 26 #Python
深度辨析Python的eval()与exec()的方法
Mar 26 #Python
详解Python locals()的陷阱
Mar 26 #Python
python 为什么说eval要慎用
Mar 26 #Python
You might like
如何写php程序?
2006/12/08 PHP
用php解析html的实现代码
2011/08/08 PHP
PHP设置进度条的方法
2015/07/08 PHP
PHPCMS手机站伪静态设置详细教程
2017/02/06 PHP
Javascript学习笔记1 数据类型
2010/01/11 Javascript
js实现跨域访问的三种方法
2015/12/09 Javascript
bootstrap警告框示例代码分享
2017/05/17 Javascript
vue cli2.0单页面title修改方法
2018/06/07 Javascript
vue车牌号校验和银行校验实战
2019/01/23 Javascript
微信公众平台获取access_token的方法步骤
2019/03/29 Javascript
vue element-ui读取pdf文件的方法
2019/11/26 Javascript
JavaScript装饰者模式原理与用法实例详解
2020/03/09 Javascript
在实例中重学JavaScript事件循环
2020/12/03 Javascript
[03:22]DSPL第一期精彩集锦:酷炫到底!
2014/11/07 DOTA
python中文乱码的解决方法
2013/11/04 Python
Python 多进程和数据传递的理解
2017/10/09 Python
Python面向对象编程基础解析(一)
2017/10/26 Python
Python 调用PIL库失败的解决方法
2019/01/08 Python
python调用百度地图WEB服务API获取地点对应坐标值
2019/01/16 Python
django mysql数据库及图片上传接口详解
2019/07/18 Python
python 自定义装饰器实例详解
2019/07/20 Python
使用 Python 清理收藏夹里已失效的网站
2019/12/03 Python
在python里创建一个任务(Task)实例
2020/04/25 Python
canvas之万花筒效果的简单实现(推荐)
2016/08/16 HTML / CSS
HTML5的表单(绝对特别强大的功能)使用示例
2013/06/20 HTML / CSS
爱尔兰电子产品购物网站:Komplett.ie
2018/04/04 全球购物
手工制作的意大利太阳镜和光学元件:Illesteva
2019/01/19 全球购物
J2EE的优越性主要表现在哪些方面
2016/03/28 面试题
旅游管理实习自我鉴定
2013/09/29 职场文书
顶撞老师检讨书
2014/02/07 职场文书
《湘夫人》教学反思
2014/02/21 职场文书
主管会计岗位职责
2014/03/13 职场文书
热门专业求职信
2014/05/24 职场文书
世界读书日的活动方案
2014/08/20 职场文书
2015年教师党员公开承诺书
2015/01/22 职场文书
Python中三种花式打印的示例详解
2022/03/19 Python