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 相关文章推荐
利用标准库fractions模块让Python支持分数类型的方法详解
Aug 11 Python
itchat接口使用示例
Oct 23 Python
matplotlib实现热成像图colorbar和极坐标图的方法
Dec 13 Python
在python环境下运用kafka对数据进行实时传输的方法
Dec 27 Python
python-itchat 统计微信群、好友数量,及原始消息数据的实例
Feb 21 Python
Python实现的远程文件自动打包并下载功能示例
Jul 12 Python
python实现登录密码重置简易操作代码
Aug 14 Python
Python模拟登入的N种方式(建议收藏)
May 31 Python
什么是python类属性
Jun 10 Python
windows支持哪个版本的python
Jul 03 Python
Python加速程序运行的方法
Jul 29 Python
对Keras自带Loss Function的深入研究
May 25 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数组声明、遍历、数组全局变量使用小结
2013/06/05 PHP
ThinkPHP结合AjaxFileUploader实现无刷新文件上传的方法
2014/10/29 PHP
php可应用于面包屑导航的递归寻找家谱树实现方法
2015/02/02 PHP
在Mac OS上搭建Nginx+PHP+MySQL开发环境的教程
2015/12/21 PHP
通过身份证号得到出生日期和性别的js代码
2009/11/23 Javascript
Array的push与unshift方法性能比较分析
2011/03/05 Javascript
浅谈EasyUi ComBotree树修改 父节点选择的问题
2016/11/07 Javascript
Bootstrap面板使用方法
2017/01/16 Javascript
JS中如何实现点击a标签返回页面顶部的问题
2017/01/19 Javascript
bootstrap datetimepicker 日期插件在火狐下出现一条报错信息的原因分析及解决办法
2017/03/08 Javascript
axios基本入门用法教程
2017/03/25 Javascript
vue2.0获取自定义属性的值
2017/03/28 Javascript
Javascript 实现匿名递归的实例代码
2017/05/25 Javascript
JS中把函数作为另一函数的参数传递方法(总结)
2017/06/28 Javascript
详解nodejs的express如何自动生成项目框架
2017/07/12 NodeJs
微信小程序实现自定义加载图标功能
2018/07/19 Javascript
使用vue点击li,获取当前点击li父辈元素的属性值方法
2018/09/12 Javascript
手把手教你 CKEDITOR 4 实现Dialog 内嵌 IFrame操作详解
2019/06/18 Javascript
javascript头像上传代码实例
2019/09/28 Javascript
jQuery利用cookie 实现本地收藏功能(不重复无需多次命名)
2019/11/07 jQuery
解决vue-pdf查看pdf文件及打印乱码的问题
2020/11/04 Javascript
[46:10]2014 DOTA2国际邀请赛中国区预选赛 CnB VS HGT
2014/05/21 DOTA
[49:29]LGD vs Winstrike 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/18 DOTA
python动态参数用法实例分析
2015/05/25 Python
Python处理文本换行符实例代码
2018/02/03 Python
Python中的pack和unpack的使用
2018/03/12 Python
基于python实现百度翻译功能
2019/05/09 Python
pytorch 把图片数据转化成tensor的操作
2021/03/04 Python
ETO男装官方网店:ETO Jeans
2019/02/28 全球购物
《列夫托尔斯泰》教学反思
2014/02/10 职场文书
《口技》教学反思
2014/02/21 职场文书
电子商务专业自荐信
2014/06/02 职场文书
学校捐书活动总结
2015/05/08 职场文书
2016党员学习心得体会范文
2016/01/23 职场文书
导游词之千岛湖
2019/09/23 职场文书
详解MySQL InnoDB存储引擎的内存管理
2021/04/08 MySQL