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中操作字符串之replace()方法的使用
May 19 Python
Pycharm远程调试openstack的方法
Nov 21 Python
Python网络编程使用select实现socket全双工异步通信功能示例
Apr 09 Python
Python装饰器用法实例总结
May 26 Python
python实现pdf转换成word/txt纯文本文件
Jun 07 Python
python绘制简单彩虹图
Nov 19 Python
详解如何在Apache中运行Python WSGI应用
Jan 02 Python
Python 使用matplotlib模块模拟掷骰子
Aug 08 Python
python异步Web框架sanic的实现
Apr 27 Python
python eventlet绿化和patch原理
Nov 21 Python
python中slice参数过长的处理方法及实例
Dec 15 Python
Python实现疫情地图可视化
Feb 05 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写的MySQL数据库用户认证系统代码
2007/03/22 PHP
PHP中使用gettext来支持多语言的方法
2011/05/02 PHP
微信支付开发告警通知实例
2016/07/12 PHP
PHP随机获取未被微信屏蔽的域名(微信域名检测)
2017/03/19 PHP
PHP实现图的邻接矩阵表示及几种简单遍历算法分析
2017/11/24 PHP
Aster vs KG BO3 第一场2.18
2021/03/10 DOTA
JavaScript 页面编码与浏览器类型判断代码
2010/06/03 Javascript
使用javascript创建快捷方式的简单实例
2013/08/09 Javascript
jQuery对指定元素中指定字符串进行替换的方法
2015/03/17 Javascript
jquery UI Datepicker时间控件的使用方法(基础版)
2015/11/07 Javascript
详解javascript立即执行函数表达式IIFE
2017/02/13 Javascript
js微信分享实现代码
2020/10/11 Javascript
vue项目中axios使用详解
2018/02/07 Javascript
vue项目设置scrollTop不起作用(总结)
2018/12/21 Javascript
Vue实例的对象参数options的几个常用选项详解
2019/11/08 Javascript
node.js +mongdb实现登录功能
2020/06/18 Javascript
Python下singleton模式的实现方法
2014/07/16 Python
Ubuntu下安装PyV8
2016/03/13 Python
利用Python中SocketServer 实现客户端与服务器间非阻塞通信
2016/12/15 Python
详解python字节码
2018/02/07 Python
浅析Python pandas模块输出每行中间省略号问题
2018/07/03 Python
浅析Python 中几种字符串格式化方法及其比较
2019/07/02 Python
python定位xpath 节点位置的方法
2019/08/27 Python
详解tensorflow2.x版本无法调用gpu的一种解决方法
2020/05/25 Python
Python实现文件压缩和解压的示例代码
2020/08/12 Python
HTML5 File接口在web页面上使用文件下载
2017/02/27 HTML / CSS
应届毕业生专业个人求职自荐信格式
2013/11/20 职场文书
横幅标语大全
2014/06/17 职场文书
会议欢迎标语
2014/06/30 职场文书
银行保安拾金不昧表扬稿
2015/05/05 职场文书
2015年语言文字工作总结
2015/07/23 职场文书
食品安全主题班会
2015/08/13 职场文书
2016公司新年问候语
2015/11/11 职场文书
2016年公共机构节能宣传周活动总结
2016/04/05 职场文书
基于Redis延迟队列的实现代码
2021/05/13 Redis
蓝牙耳机怎么连接电脑win11? Win11蓝牙耳机连接电脑的技巧
2023/01/09 数码科技