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 相关文章推荐
wxpython 最小化到托盘与欢迎图片的实现方法
Jun 09 Python
Python Tkinter基础控件用法
Sep 03 Python
Python中的字符串替换操作示例
Jun 27 Python
Python使用functools模块中的partial函数生成偏函数
Jul 02 Python
python 利用栈和队列模拟递归的过程
May 29 Python
python爬虫URL重试机制的实现方法(python2.7以及python3.5)
Dec 18 Python
查看python安装路径及pip安装的包列表及路径
Apr 03 Python
Python实现连接MySql数据库及增删改查操作详解
Apr 16 Python
Django使用Jinja2模板引擎的示例代码
Aug 09 Python
flask框架自定义过滤器示例【markdown文件读取和展示功能】
Nov 08 Python
python 命名规范知识点汇总
Feb 14 Python
python读取xml文件方法解析
Aug 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
Smarty+QUICKFORM小小演示
2007/02/25 PHP
页面利用渐进式JPEG来提升用户体验度
2014/12/01 PHP
php和editplus正则表达式去除空白行
2015/04/17 PHP
PHP后期静态绑定实例浅析
2018/12/21 PHP
php实现微信小程序授权登录功能(实现流程)
2019/11/13 PHP
简略的前端架构心得&amp;&amp;基于editor为例子的编码小技巧
2010/11/25 Javascript
jQuery EasyUI API 中文文档 - ValidateBox验证框
2011/10/06 Javascript
javascript设计模式 封装和信息隐藏(上)
2012/07/24 Javascript
js控制input框只读实现示例
2014/01/20 Javascript
深入理解JS中的变量及作用域、undefined与null
2014/03/04 Javascript
深入探讨JavaScript、JQuery屏蔽网页鼠标右键菜单及禁止选择复制
2014/06/10 Javascript
JS实现页面超时后自动跳转到登陆页面
2015/01/19 Javascript
JavaScript脚本判断蜘蛛来源的方法
2015/09/22 Javascript
jQuery简单获取DIV和A标签元素位置的方法
2017/02/07 Javascript
实现图片首尾平滑轮播(JS原生方法—节流)
2017/10/17 Javascript
vue element-ui table表格滚动加载方法
2018/03/02 Javascript
javascript设计模式 ? 迭代器模式原理与用法实例分析
2020/04/17 Javascript
Vue this.$router.push(参数)实现页面跳转操作
2020/09/09 Javascript
python3.6的venv模块使用详解
2018/08/01 Python
20行python代码实现人脸识别
2019/05/05 Python
详解python对象之间的交互
2020/09/29 Python
python3排序的实例方法
2020/10/20 Python
用React加CSS3实现微信拆红包动画效果
2017/03/13 HTML / CSS
美国卡车、吉普车和SUV零件网站:4 Wheel Parts
2016/11/24 全球购物
亚历山大·王官网:Alexander Wang
2017/06/23 全球购物
python re模块和正则表达式
2021/03/24 Python
生日宴会答谢词
2014/01/09 职场文书
保安部任务及岗位职责
2014/02/25 职场文书
2015年初一班主任工作总结
2015/05/13 职场文书
企业管理制度设计时要注意的几种“常见病”!
2019/04/19 职场文书
小学五年级(说明文3篇)
2019/08/13 职场文书
vue-cli4.5.x快速搭建项目
2021/05/30 Vue.js
python基础入门之普通操作与函数(三)
2021/06/13 Python
python非标准时间的转换
2021/07/25 Python
JavaScript小技巧带你提升你的代码技能
2021/09/15 Javascript
Nginx 502 bad gateway错误解决的九种方案及原因
2022/08/14 Servers