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中使用MELIAE分析程序内存占用实例
Feb 18 Python
python输出当前目录下index.html文件路径的方法
Apr 28 Python
Python实现句子翻译功能
Nov 14 Python
Python实现比较扑克牌大小程序代码示例
Dec 06 Python
Python设计模式之MVC模式简单示例
Jan 10 Python
浅谈DataFrame和SparkSql取值误区
Jun 09 Python
Falsk 与 Django 过滤器的使用与区别详解
Jun 04 Python
Python实现剪刀石头布小游戏(与电脑对战)
Dec 31 Python
tensorflow之获取tensor的shape作为max_pool的ksize实例
Jan 04 Python
python GUI库图形界面开发之PyQt5控件数据拖曳Drag与Drop详细使用方法与实例
Feb 27 Python
详解Python IO编程
Jul 24 Python
python tqdm实现进度条的示例代码
Nov 10 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中实现图片的锐化
2006/10/09 PHP
解读PHP的Yii框架中请求与响应的处理流程
2016/03/17 PHP
聊聊 PHP 8 新特性 Attributes
2020/08/19 PHP
javascript 二进制运算技巧解析
2012/11/27 Javascript
面向对象设计模式的核心法则
2013/11/10 Javascript
JS cookie中文乱码解决方法
2014/01/28 Javascript
文本域光标操作的jQuery扩展分享
2014/03/10 Javascript
javascript 获取元素样式必杀技
2014/05/04 Javascript
我的Node.js学习之路(一)
2014/07/06 Javascript
JavaScript eval() 函数介绍及应用示例
2014/07/29 Javascript
Js+Ajax,Get和Post在使用上的区别小结
2016/06/08 Javascript
Mongoose学习全面理解(推荐)
2017/01/21 Javascript
javascript Function函数理解与实战
2017/12/01 Javascript
修改Nodejs内置的npm默认配置路径方法
2018/05/13 NodeJs
JavaScript 格式化数字、金额、千分位、保留几位小数、舍入舍去
2019/07/23 Javascript
Vue实现图片与文字混输效果
2019/12/04 Javascript
用python登录Dr.com思路以及代码分享
2014/06/25 Python
在windows系统中实现python3安装lxml
2016/03/23 Python
python函数的5种参数详解
2017/02/24 Python
在centos7中分布式部署pyspider
2017/05/03 Python
python数字图像处理之高级滤波代码详解
2017/11/23 Python
一份python入门应该看的学习资料
2018/04/11 Python
python 3.6.2 安装配置方法图文教程
2018/09/18 Python
python发qq消息轰炸虐狗好友思路详解(完整代码)
2020/02/15 Python
Python稀疏矩阵及参数保存代码实现
2020/04/18 Python
matplotlib之pyplot模块之标题(title()和suptitle())
2021/02/22 Python
阿联酋航空官方网站:Emirates
2017/10/17 全球购物
个人实用简单的自我评价
2013/10/19 职场文书
校庆标语集锦
2014/06/25 职场文书
2014年初级职称工作总结
2014/12/08 职场文书
写给医生的感谢信
2015/01/22 职场文书
亚布力滑雪场导游词
2015/02/09 职场文书
公司放假通知怎么写
2015/04/15 职场文书
增值税发票丢失证明
2015/06/19 职场文书
2016重阳节红领巾广播稿
2015/12/18 职场文书
Java中try catch处理异常示例
2021/12/06 Java/Android