- 不用加法对两个数相加(下面三题一样 因此总结到一起)
leetcode 371. 两整数之和
面试题17.01 不用加号的加法
剑指offer 65 不用加减乘除做加法
解法一:过辣
解法二:亦或运算结合与运算 递归或循环 注意判断条件 以及python自身的特殊情况
class Solution(object):
def getSum(self, a, b):
"""
:type a: int
:type b: int
:rtype: int
"""
# 方法一:过辣
return a+b
# 方法二:
# 亦或 *** 作^相当于无进位位的加法
# 与 *** 作&再左移一位<<1相当于获取进位
# a+b等价于上面两个 *** 作相加 停止的条件是第二步左移直至无进位
if(b == 0):
return a
return self.getSum(a ^ b, (a & b) << 1)
# python方法二优化
# 由于python 无int long 都是64位 因此 *** 作需要复杂一些
x=0xffffffff
# 舍掉32位以上的
a,b=a&x,b&x
while b!=0:
a,b=a^b,(a&b)<<1&x
if a<=0x7fffffff:
return a
else:
# 负数的话 先和x亦或相当于每位取反 结果再取一次得到真正结果 相当于补码 *** 作
return ~(a^x)
- 递归乘法
直接过辣
class Solution(object):
def multiply(self, A, B):
"""
:type A: int
:type B: int
:rtype: int
"""
return A*B
- Pow(x, n)
直接过辣
class Solution(object):
def myPow(self, x, n):
"""
:type x: float
:type n: int
:rtype: float
"""
return pow(x,n)
4.开方Sqrt(x)
解法一:过辣 直接用上面第三题的1/2次方取整即可
解法二:二分查找 注意x=1和边界条件 最后return high 还是low 可以找个特殊值带入一下
if x==1:
return 1
low=1
high=x//2
while low<=high:
mid=(low+high)//2
if mid*mid==x:
return mid
elif mid*mid<x:
low=mid+1
else:
high=mid-1
return high
- 返回两个数中较大的数值 不可以比较排序
解法一: 判断 过辣
解法二:数学解法 相加+相减的绝对值 然后除以2
class Solution(object):
def maximum(self, a, b):
"""
:type a: int
:type b: int
:rtype: int
"""
return ((a + b) + abs(a - b)) // 2
# return a if a>b else b
- 反转两次的数字
咱就真反转两次 去掉0第一次反转后前面的0再比较
class Solution(object):
def isSameAfterReversals(self, num):
"""
:type num: int
:rtype: bool
"""
r1=list(reversed(str(num)))
r1=int(''.join(r1))
r2=list(reversed(str(r1)))
r2=int(''.join(r2))
return num == r2
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)