LeetCode:118.杨辉三角面试题 17.01. 不用加号的加法
Posted 南岸青栀*
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode:118.杨辉三角面试题 17.01. 不用加号的加法相关的知识,希望对你有一定的参考价值。
118. 杨辉三角
代码
class Solution:
def generate(self, numRows: int) -> List[List[int]]:
res = []
line = [1]
for i in range(numRows):
res.append(line)
line = [1] + [line[i]+line[i+1] for i in range(len(line)-1)]+[1]
return res
面试题 17.01. 不用加号的加法
代码
class Solution:
def add(self, a: int, b: int) -> int:
#变为无符号进行加法
# 将a,b 正数则不变,负数变为补码。题目说不会溢出32位整数
a &= 0xFFFFFFFF
# print(a)
b &= 0xFFFFFFFF
# print(b)
while b != 0:
#记录需要进位的位置
carry = a & b
#第一次为不进位加法,之后将进位存储b中相加.
a ^= b
#当前位进位加法完成后,为下一位做准备,所以将进位数左移。左移之后会将符号位顶掉,所以需要变为无符号为
b = ((carry) << 1) & 0xFFFFFFFF
#小于0x800000000则说明为正数,反之为负数,溢出.对其进行异或操作得到正值,然后取反,符号位变为1
return a if a < 0x80000000 else ~(a^0xFFFFFFFF)
补充:
Python,Java 等语言中的数字都是以 补码 形式存储的。但 Python 没有 int , long 等不同长度变量,即在编程时无变量位数的概念。
获取负数的补码: 需要将数字与十六进制数 0xffffffff
相与。可理解为舍去此数字 32 位以上的数字(将 32 位以上都变为 00 ),从无限长度变为一个 32 位整数。
返回前数字还原: 若补码 aa 为负数( 0x7fffffff
是最大的正数的补码 ),需执行 ~(a ^ x)
操作,将补码还原至 Python 的存储格式。 a ^ x
运算将 1 至 32 位按位取反; ~
运算是将整个数字取反;因此,~(a ^ x)
是将 32 位以上的位取反,1 至 32 位不变。
以上是关于LeetCode:118.杨辉三角面试题 17.01. 不用加号的加法的主要内容,如果未能解决你的问题,请参考以下文章
⭐算法入门⭐《递推 - 二维》简单01 —— LeetCode 118. 杨辉三角