@Author:Runsen @Date:2020/7/3
人生最重要的不是所站的位置,而是内心所朝的方向。只要我在每篇博文中写得自己体会,修炼身心;在每天的不断重复学习中,耐住寂寞,练就真功,不畏艰难,奋勇前行,不忘初心,砥砺前行,人生定会有所收获,不留遗憾 (作者:Runsen )
作者介绍:Runsen目前大三下学期,专业化学工程与工艺,大学沉迷日语,Python, Java和一系列数据分析软件。导致翘课严重,专业排名中下。.在大学60%的时间,都在。决定今天比昨天要更加努力。 前面文章,点击下面链接
我的Python教程,不断整理,反复学习
今日,我决定继续更新Python教程,今天就开始了七十三、Python | Leetcode数字系列(上篇)。
这一部分是比较简单的,就当作Python编写代码的练习题
最好理解的一种解法就是先将 整数转为字符串 ,然后将只需要循环每个字符进行判断对应元素是否相等即可。可以的话,还可以return str(x) == str(x)[::-1]简单粗暴。 `
class Solution: def isPalindrome(self, x: int) -> bool: if not x: return True str_x = str(x) n = len(str_x) for i in range(n-1): if str_x[i] != str_x[n-1-i]: return False return True不将整数转为字符串,那么算出对应的回文数在比较欧克。
class Solution: def isPalindrome(self, x: int) -> bool: if x < 0: # 如果为负数,直接返回 false return False num = x cur = 0 while num !=0: cur = cur*10 + num%10 num //=10 return cur == x # 最后比较 数值反转前后是否相等使用哈希表解决.哈希表键为整数,值为罗马数字,且键从大到小排列;遍历整个哈希表,判断当前数值是否大于等于此刻的键:若能,则s加上整除的个数乘以值;若不能,则遍历下一个。
class Solution: def intToRoman(self, num: int) -> str: d = {1000: 'M', 900: 'CM', 500: 'D', 400: 'CD', 100: 'C', 90: 'XC', 50: 'L', 40: 'XL', 10: 'X', 9: 'IX', 5: 'V', 4: 'IV', 1: 'I'} res = '' for k in d: while num >= k: res += d[k] num -= k return res思路:
创建hashMap字典表映射罗马数字和整数。.如果当前字符代表的值不小于其右边,就加上该值;否则就减去该值。 class Solution: def romanToInt(self, s: str) -> int: a = {'I':1, 'V':5, 'X':10, 'L':50, 'C':100, 'D':500, 'M':1000} ans=0 for i in range(len(s)): if i<len(s)-1 and a[s[i]]<a[s[i+1]]: ans-=a[s[i]] else: ans+=a[s[i]] return ans乘除取余都不让用,那就位运算走起. 那问题是,如何设计位运算?商*除数+余数=被除数,这个式子大家肯定都清楚 在本题中, 余数是可以忽略的,当然, 余数肯定是小于 除数的 那么我们就可以理解为:商就是 被除数减去N多个 除数,直到 被除数-N个除数变得小于除数最终就是 N这个 商了。
让我们先回顾一下小学时,怎么通过列竖式的方法计算两个整数的除法,以 45/2 为例:
仔细观察不难发现,这种算法是把除法化归成移位和减法两种运算方法。对于 10 进制数,移位运算就是乘(左移)除(右移)10,而我们都知道计算机中的移位运算是乘(左移)除(右移)2,因为计算机是通过二进制的方法存储数的。这样,类比十进制,二进制的除法(仍以 45/2 为例)可以写作(注意,这里我们并没有用到乘除法)
下面就是代码实现了
class Solution: def divide(self, dividend: int, divisor: int) -> int: # 使用异或判断符号 sign = (dividend>0)^(divisor>0) # 方便起见全部使用正数来做除法,最后加上符号 dividend = abs(dividend) divisor = abs(divisor) count = 0 while dividend >= divisor: divisor <<= 1 count += 1 result = 0 while count > 0: count -= 1 divisor >>= 1 if divisor <= dividend: dividend = dividend-divisor result += 1<<count if sign: result = -result return result if -(1<<31)<=result<=(1<<31)-1 else (1<<31)-1主要是注意n的正负,这个题比较简单了,直接递归调用就行。
如果 n 是负数,那么相当于求$ (1/x)^(-n)。n 是正数 且 奇数,那么结果需要单独乘以 x如果 n 是正数 且 偶数,求(x2)(n/2),一直递归下去即可。 class Solution(object): def myPow(self, x, n): """ :type x: float :type n: int :rtype: float """ if n == 0: return 1 if n < 0: x = 1 / x n = -n if n % 2: return x * self.myPow(x, n - 1) return self.myPow(x * x, n / 2)使用迭代的方法,这个方法叫做二分求幂。
class Solution: def myPow(self, x: float, n: int) -> float: if n == 0: return 1 if n < 0: x = 1 / x n = -n p = 1 while n > 1: if n % 2 == 0: x = x * x n /= 2 else: p *= x n -= 1 p *= x return p 刘润森! 认证博客专家 Python Java 前端 17年就读于东莞XX学院化学工程与工艺专业,GitChat作者。Runsen的微信公众号是"Python之王",因为Python入了IT的坑,从此不能自拔。公众号内容涉及Python,Java计算机、杂谈。干货与情怀同在。喜欢的微信搜索:「Python之王」。个人微信号:RunsenLiu。不关注我公号一律拉黑!!!