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批量导出导入MySQL用户的方法
Nov 15 Python
在Python中操作文件之truncate()方法的使用教程
May 25 Python
numpy返回array中元素的index方法
Jun 27 Python
Python3连接SQLServer、Oracle、MySql的方法
Jun 28 Python
使用tensorflow实现线性回归
Sep 08 Python
python 调用有道api接口的方法
Jan 03 Python
搞定这套Python爬虫面试题(面试会so easy)
Apr 03 Python
python下载库的步骤方法
Oct 12 Python
Python大数据之从网页上爬取数据的方法详解
Nov 16 Python
python将时分秒转换成秒的实例
Dec 07 Python
python logging 日志的级别调整方式
Feb 21 Python
浅谈Python 函数式编程
Jun 20 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 生成文字png图片的代码
2011/04/17 PHP
PHP魔术方法__GET、__SET使用实例
2014/11/25 PHP
PHP打印输出函数汇总
2016/08/28 PHP
PHP中静态变量的使用方法实例分析
2016/12/01 PHP
thinkPHP订单数字提醒功能的实现方法
2016/12/01 PHP
php 截取中英文混合字符串的方法
2018/05/31 PHP
php获取是星期几的的一些常用姿势
2019/12/15 PHP
js实现运行代码需要刷新的解决方法
2007/08/18 Javascript
jquery form表单提交插件asp.net后台中文解码
2010/06/12 Javascript
a标签的href与onclick事件的区别详解
2014/11/12 Javascript
jQuery简单实现日历的方法
2015/05/04 Javascript
整理关于Bootstrap表单的慕课笔记
2017/03/29 Javascript
使用jquery的jsonp如何发起跨域请求及其原理详解
2017/08/17 jQuery
浅谈webpack-dev-server的配置和使用
2018/05/17 Javascript
详解VUE中常用的几种import(模块、文件)引入方式
2018/07/03 Javascript
vue.js实现数据库的JSON数据输出渲染到html页面功能示例
2019/08/03 Javascript
[01:14]英雄,所敬略同——2018完美盛典宣传视频
2018/12/05 DOTA
[57:36]DOTA2-DPC中国联赛 正赛 SAG vs CDEC BO3 第三场 2月1日
2021/03/11 DOTA
python通过邮件服务器端口发送邮件的方法
2015/04/30 Python
使用python爬取B站千万级数据
2018/06/08 Python
详解基于python的多张不同宽高图片拼接成大图
2019/09/26 Python
pytorch中的卷积和池化计算方式详解
2020/01/03 Python
Foreo国际站:Foreo International
2018/10/29 全球购物
俄罗斯名牌服装网上商店:UNIQUE FABRIC
2019/07/25 全球购物
PyQt QMainWindow的使用示例
2021/03/24 Python
高校生生产实习自我鉴定
2013/09/21 职场文书
求职自荐信
2013/12/14 职场文书
好矿嫂事迹材料
2014/01/21 职场文书
亲戚结婚的请假条
2014/02/11 职场文书
信息管理应届生求职信
2014/03/07 职场文书
大学军训感言1500字
2014/03/09 职场文书
授权委托书(完整版)
2014/09/10 职场文书
力克胡哲观后感
2015/06/10 职场文书
寻找最美乡村教师观后感
2015/06/18 职场文书
三八红旗手先进事迹材料(2016推荐版)
2016/02/25 职场文书
JVM上高性能数据格式库包Apache Arrow入门和架构详解(Gkatziouras)
2021/05/26 Servers