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实用代码片段收集贴
Jun 03 Python
python Django批量导入数据
Mar 25 Python
Django查询数据库的性能优化示例代码
Sep 24 Python
Python定时器实例代码
Nov 01 Python
Python编程pygal绘图实例之XY线
Dec 09 Python
浅析Python数据处理
May 02 Python
python可视化篇之流式数据监控的实现
Aug 07 Python
为什么是 Python -m
Jun 19 Python
Python getattr()函数使用方法代码实例
Aug 10 Python
Python脚本打包成可执行文件过程解析
Oct 20 Python
python爬虫实现爬取同一个网站的多页数据的实例讲解
Jan 18 Python
pytorch 6 batch_train 批训练操作
May 28 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 gd等比例缩放压缩图片函数
2016/06/12 PHP
thinkPHP简单调用函数与类库的方法
2017/03/15 PHP
php文件包含目录配置open_basedir的使用与性能详解
2017/04/03 PHP
php数据结构之顺序链表与链式线性表示例
2018/01/22 PHP
jquery(live)中File input的change方法只起一次作用的解决办法
2011/10/21 Javascript
javascript相等运算符与等同运算符详细介绍
2013/11/09 Javascript
详解JavaScript中数组的相关知识
2015/07/29 Javascript
Javascript对象字面量的理解
2016/06/22 Javascript
JavaScript编写九九乘法表(两种任选)
2017/02/04 Javascript
基于Vue渲染与插件的加载顺序的问题详解
2018/03/05 Javascript
在vue中读取本地Json文件的方法
2018/09/06 Javascript
nodejs aes 加解密实例
2018/10/10 NodeJs
es6基础学习之解构赋值
2018/12/10 Javascript
npm 语义版本控制详解
2019/09/10 Javascript
ES6中new Function()语法及应用实例分析
2020/02/19 Javascript
jquery实现的放大镜效果示例
2020/02/24 jQuery
Python中针对函数处理的特殊方法
2014/03/06 Python
Python 类与元类的深度挖掘 II【经验】
2016/05/06 Python
Python多进程并发与多线程并发编程实例总结
2018/02/08 Python
selenium python 实现基本自动化测试的示例代码
2019/02/25 Python
python中dict()的高级用法实现
2019/11/13 Python
浅析PyCharm 的初始设置(知道)
2020/10/12 Python
基于 HTML5 的 WebGL 3D 版俄罗斯方块的示例代码
2018/05/28 HTML / CSS
仿CSDN Blog返回页面顶部功能实现原理及代码
2013/06/30 HTML / CSS
html5使用canvas实现跟随光标跳动的火焰效果
2014/01/07 HTML / CSS
一级方程式赛车官方网上商店:F1 Store(支持中文)
2018/01/12 全球购物
Java的基础面试题附答案
2016/01/10 面试题
法院实习人员自我鉴定
2013/09/26 职场文书
电话销售经理岗位职责
2013/12/07 职场文书
库房主管岗位职责
2013/12/31 职场文书
企业精细化管理实施方案
2014/03/23 职场文书
2014年四风问题个人对照自查剖析材料
2014/09/15 职场文书
公安纪律作风整顿剖析材料
2014/10/10 职场文书
毕业生求职自荐信(2016最新版)
2016/01/28 职场文书
2019年入党思想汇报
2019/03/25 职场文书
Python自动化爬取天眼查数据的实现
2021/06/15 Python