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 制作图片转pdf工具
Jan 30 Python
Python中的字符串替换操作示例
Jun 27 Python
Python中的错误和异常处理简单操作示例【try-except用法】
Jul 25 Python
聊聊Python中的pypy
Jan 12 Python
python3解析库lxml的安装与基本使用
Jun 27 Python
python实现旋转和水平翻转的方法
Oct 25 Python
与Django结合利用模型对上传图片预测的实例详解
Aug 07 Python
Python进度条的制作代码实例
Aug 31 Python
Django配置MySQL数据库的完整步骤
Sep 07 Python
python多进程(加入进程池)操作常见案例
Oct 21 Python
关于tf.TFRecordReader()函数的用法解析
Feb 17 Python
Lombok插件安装(IDEA)及配置jar包使用详解
Nov 04 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中绘制图像的一些函数总结
2014/11/19 PHP
6个超实用的PHP代码片段
2015/08/10 PHP
PHP+Mysql+jQuery中国地图区域数据统计实例讲解
2015/10/10 PHP
全面解析PHP验证码的实现原理 附php验证码小案例
2016/08/17 PHP
PHP实现对数组分页处理实例详解
2017/02/07 PHP
PHP长网址与短网址的实现方法
2017/10/13 PHP
PHP PDO数据库操作预处理与注意事项
2019/03/16 PHP
PHP实现数据四舍五入的方法小结【4种方法】
2019/03/27 PHP
php输出反斜杠的实例方法
2019/09/19 PHP
IE图片缓存document.execCommand(&quot;BackgroundImageCache&quot;,false,true)
2011/03/01 Javascript
js实现在页面上弹出蒙板技巧简单实用
2013/04/16 Javascript
jquery ajax post提交数据乱码
2013/11/05 Javascript
常见浏览器多长时间会提示“脚本运行时间过长”总结
2014/04/29 Javascript
JS原型链怎么理解
2016/06/27 Javascript
Bootstrap源码解读按钮(5)
2016/12/23 Javascript
angular bootstrap timepicker TypeError提示怎么办
2017/06/13 Javascript
文本溢出插件jquery.dotdotdot.js使用方法详解
2017/06/22 jQuery
AngularJS select加载数据选中默认值的方法
2018/02/28 Javascript
JavaScript 斐波那契数列 倒序输出 输出100以内的质数代码实例
2019/09/11 Javascript
vue pages 多入口项目 + chainWebpack 全局引用缩写说明
2020/09/21 Javascript
[01:03:41]完美世界DOTA2联赛PWL S3 DLG vs Phoenix 第一场 12.17
2020/12/19 DOTA
使用python实现strcmp函数功能示例
2014/03/25 Python
python递归全排列实现方法
2018/08/18 Python
python如何创建TCP服务端和客户端
2018/08/26 Python
python json load json 数据后出现乱序的解决方案
2020/02/27 Python
Python类的绑定方法和非绑定方法实例解析
2020/03/04 Python
纯CSS3单页切换导航菜单界面设计的简单实现
2016/08/16 HTML / CSS
旧时光糖果:Old Time Candy
2018/02/05 全球购物
中文系学生自荐信范文
2013/11/13 职场文书
记者岗位职责
2014/01/06 职场文书
文秘求职信范文
2014/04/10 职场文书
励志演讲稿600字
2014/08/21 职场文书
法人代表证明书格式
2014/10/01 职场文书
综合测评自我评价
2015/03/06 职场文书
MySQL学习必备条件查询数据
2022/03/25 MySQL
Windows10安装Apache2.4的方法步骤
2022/06/25 Servers