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利用hook技术破解https的实例代码
Mar 25 Python
使用graphics.py实现2048小游戏
Mar 10 Python
浅谈python中的变量默认是什么类型
Sep 11 Python
Python基于列表模拟堆栈和队列功能示例
Jan 05 Python
在Python中pandas.DataFrame重置索引名称的实例
Nov 06 Python
详解python--模拟轮盘抽奖游戏
Apr 12 Python
如何使用Python多线程测试并发漏洞
Dec 18 Python
pytorch GAN伪造手写体mnist数据集方式
Jan 10 Python
在python中利用dict转json按输入顺序输出内容方式
Feb 27 Python
PyQt5 文本输入框自动补全QLineEdit的实现示例
May 13 Python
使用Python通过oBIX协议访问Niagara数据的示例
Dec 04 Python
Python3 多线程(连接池)操作MySQL插入数据
Jun 09 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 5.2.14+fpm+memcached(具体操作详解)
2013/06/18 PHP
php操作memcache缓存方法分享
2015/06/03 PHP
反射调用private方法实践(php、java)
2015/12/21 PHP
Express实现前端后端通信上传图片之存储数据库(mysql)傻瓜式教程(一)
2015/12/10 Javascript
javascript设置和获取cookie的方法实例详解
2016/01/05 Javascript
JS不用正则验证输入的字符串是否为空(包含空格)的实现代码
2016/06/14 Javascript
JS实现动态表格的添加,修改,删除功能(推荐)
2016/06/15 Javascript
使用ReactJS实现tab页切换、菜单栏切换、手风琴切换和进度条效果
2016/10/17 Javascript
ES6中Proxy代理用法实例浅析
2017/04/06 Javascript
JavaScript中使用webuploader实现上传视频功能(demo)
2017/04/10 Javascript
angularjs $http实现form表单提交示例
2017/06/09 Javascript
AngularJS select设置默认值的实现方法
2017/08/25 Javascript
angularjs实现简单的购物车功能
2017/09/21 Javascript
利用JS实现scroll自定义滚动效果详解
2017/10/17 Javascript
javascript变量提升和闭包理解
2018/03/12 Javascript
微信小程序使用component自定义toast弹窗效果
2018/11/27 Javascript
vant 时间选择器--开始时间和结束时间实例
2020/11/04 Javascript
Python的Flask框架应用调用Redis队列数据的方法
2016/06/06 Python
深入理解Python装饰器
2016/07/27 Python
Python爬虫通过替换http request header来欺骗浏览器实现登录功能
2018/01/07 Python
Python科学计算包numpy用法实例详解
2018/02/08 Python
详解Django之auth模块(用户认证)
2018/04/17 Python
IntelliJ IDEA安装运行python插件方法
2018/12/10 Python
django的auth认证,authenticate和装饰器功能详解
2019/07/25 Python
python树的同构学习笔记
2019/09/14 Python
基于Python执行dos命令并获取输出的结果
2019/12/30 Python
python 数据库查询返回list或tuple实例
2020/05/15 Python
优秀教师先进事迹
2014/01/22 职场文书
制药工程专业个人求职自荐信
2014/01/25 职场文书
军训 自我鉴定
2014/02/03 职场文书
双语教学实施方案
2014/03/23 职场文书
党风廉设责任书
2014/04/16 职场文书
弄虚作假心得体会
2014/09/10 职场文书
python基础详解之if循环语句
2021/04/24 Python
python缺失值的解决方法总结
2021/06/09 Python
Pandas 数据编码的十种方法
2022/04/20 Python