classSolution: defprintBin(self, num: float) -> str: res = [] for i inrange(1,50): if num - 1/(2**i) >= 0: num = num - 1/(2**i) res.append(1) else: res.append(0) index2 = len(res) - res[::-1].index(1) if index2>=32: return"ERROR" return'0.' + "".join([str(x) for x in res[:index2]])
classSolution: deftoHex(self, num: int) -> str: num_lst = list("0123456789abcdef") res = [] if num < 0: num = num + 2**32 while num > 0: num, n = divmod(num, 16) res.append(n) res2 = [num_lst[i] for i in res[::-1]] return"".join(res2)
# v1 使用递归 classSolution: defmyPow(self, x: float, n: int) -> float: defquickMul(N): if N == 0: return1.0 y = quickMul(N // 2) return y * y if N % 2 == 0else y * y * x return quickMul(n) if n >= 0else1.0 / quickMul(-n)
# v2 使用快读幂指数算法 classSolution: defmyPow(self, x: float, n: int) -> float: if x == 0.0: return0.0 res = 1 if n < 0: x, n = 1 / x, -n while n: if n & 1: res *= x x *= x n >>= 1 return res
classSolution: defmyPow(self, x: float, n: int) -> float: res = 1 flag = 0 if n < 0: n = -n flag = 1 while n: if n&1: res *= x n >>= 1 x = x * x return res ifnot flag else1/res
defispow(x): return x>0and x & (x-1)==0 cnt = 0 for i inrange(len(nums)): for j inrange(i+1, len(nums)): v = nums[i] + nums[j] if ispow(v): cnt += 1 return cnt # 错误 classSolution: defcountPairs(self, deliciousness: List[int]) -> int: cnt = Counter(deliciousness) res = 0 print(cnt.keys()) for key in cnt.keys(): for i inrange(32): if key == 2 **i: res = res + cnt[key] * (cnt[key] - 1) else: res = res + cnt[key] * (cnt[2 ** i - key]) return res//2 # 好 classSolution: defcountPairs(self, deliciousness: List[int]) -> int: cnt = Counter(deliciousness) res = 0 print(cnt.keys()) for key in cnt.keys(): for i inrange(32): if key == 2 ** (i-1): # 改动 res = res + cnt[key] * (cnt[key] - 1) else: res = res + cnt[key] * (cnt[2 ** i - key]) return res//2
classSolution: defdivide(self, dividend: int, divisor: int) -> int: flag = 1if dividend * divisor > 0else -1 dividend = abs(dividend) divisor = abs(divisor) if divisor == 0: c = 0 elif divisor == 1: c = dividend elif divisor == dividend: c = 1 else: i = 1 while divisor * i < dividend: i *= 2
l = i // 2 r = i
while r - l > 1: mid = (r + l) / 2 if mid * divisor > dividend: r = mid else: l = mid c = l c = c * flag if c >= 2147483647: c = 2147483647 if c <= -1 * math.pow(2, 31): c = -1 * math.pow(2, 31) returnint(c)
classSolution: defdivide(self, dividend: int, divisor: int) -> int: flag = 1if dividend * divisor > 0else -1 dividend = abs(dividend) divisor = abs(divisor) if divisor == 0: c = 0 elif divisor == 1: c = dividend elif divisor == dividend: c = 1 else: i = 1 while divisor * i <= dividend: i *= 2
l = i // 2 r = i
while r - l > 1: mid = (r + l) / 2 if mid * divisor > dividend: r = mid else: l = mid c = l c = c * flag if c >= 2147483647: c = 2147483647 if c <= -1 * math.pow(2, 31): c = -1 * math.pow(2, 31) returnint(c)
这是可以通过的代码。
高级的结算结果如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
defdivide(a, b): INT_MIN, INT_MAX = -2 ** 31, 2 ** 31 - 1 if a == INT_MIN and b == -1: return INT_MAX
sign = -1if (a > 0) ^ (b > 0) else1
a, b = abs(a), abs(b) ans = 0 for i inrange(31, -1, -1): if (a >> i) - b >= 0: a = a - (b << i) ans += 1 << i
# bug 修复:因为不能使用乘号,所以将乘号换成三目运算符 return ans if sign == 1else -ans
我模仿写的
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
classSolution: defdivide(self, a: int, b: int) -> int: INT_MIN, INT_MAX = -2 ** 31, 2 ** 31 - 1 if a == INT_MIN and b == -1: return INT_MAX if b == 0or a == 0: return0 flag = 1if a*b>0else -1 a,b = abs(a),abs(b) ans = 0 for i inrange(31,-1,-1): if (a>>i) - b >= 0: a = a - (b<<i) ans+= 1<<i return ans*flag
classSolution: deftitleToNumber(self, columnTitle: str) -> int: num = 0 multipy = 1 for i in columnTitle[::-1]: v = ord(i) - ord('A') + 1 num += v * multipy multipy *= 26 return num
classSolution: defcanMeasureWater(self, x: int, y: int, z: int) -> bool: if x + y < z: returnFalse if x == 0or y == 0: return z == 0or x + y == z return z % math.gcd(x, y) == 0
# 超时 直接循环来做的话,会超时,因此需要熊2到sqrt进行遍历,这样会少了一部分的计算量 # 通过 classSolution: defcheckPerfectNumber(self, num: int) -> bool: if num==1: returnFalse res = [1] for i inrange(2,int(num**0.5)+1): if num % i == 0: res.append(i) res.append(num//i) ifsum(res)==num: returnTrue else: returnFalse
代码如下 pri = {"(": 1, "+": 2, "-": 2, "*": 3, "/": 3} ops_stack = [] post_stack = [] s = "(1+2)/3-4*2-(3-4)" for i in s: if i == ' ': continue if i.isdigit(): post_stack.append(i) elif i == "(": ops_stack.append(i) elif i == ")": while ops_stack[-1] != "(": post_stack.append(ops_stack.pop()) else: while ops_stack and pri[ops_stack[-1]] >= pri[i]: post_stack.append(ops_stack.pop()) ops_stack.append(i) post_stack.extend([i for i in ops_stack[::-1] if i != "("])
s1 = [] for i in post_stack: ifnot i.isdigit(): a = int(s1.pop()) b = int(s1.pop()) s1.append(do_math(i, a, b)) else: s1.append(i) sum(s1)
# 下面通过将中缀表达式转换为后缀表达式,并进行运算 defmy_operation(symbol, a, b): a, b = int(a), int(b) if symbol == '+': return a + b elif symbol == '-': return a - b elif symbol == '*': return a * b elif symbol == '/': return a / b
defto_operation(result, stack): two = result.pop() one = result.pop() symbol = stack.pop() ret = my_operation(symbol, one, two) print(f"{one}{symbol}{two} = {ret}") result.append(ret)
### 在表达式转换的时候就一边进行了运算 for i in a: # 如果是数字直接添加到结果 if i.isdigit(): result.append(i) # 如果是 + - * / 运算,则先出栈更低优先级的,然后入栈 elif i in symbol_1: # 如果优先级低,则出栈所有优先级>=的符号 while priority[i] <= priority[stack[-1]]: to_operation(result, stack) # 压入符号 stack.append(i) # 如果是左括号,直接压入 elif i in symbol_2: stack.append(i) # 如果是右括号,则出栈,直到遇到了匹配的左括号,然后吧左括号也出栈 elif i in symbol_3: while stack[-1] != match_2[i]: to_operation(result, stack) stack.pop()
for i in s: if i.isdigit(): nums = nums*10 + int(i) elif i==' ': continue else: if pre_flag == '+': stack.append(nums) if pre_flag == '-': stack.append(-nums) if pre_flag == '*': stack.append(stack.pop()*nums) if pre_flag == '/': stack.append(int(stack.pop()/nums)) pre_flag = i #注意 nums = 0 returnsum(stack)
# 错误 classSolution: defplusOne(self, digits: List[int]) -> List[int]: res = [] y = 0 y = 0 digits2 = digits[::-1] for i inrange(len(digits2)): if i == 0: v = (digits2[i] + y + 1) % 10 else: v = (digits2[i] + y) % 10 y = (digits2[i] + 1) // 10 res.append(v) if y > 0: res.append(y) return res[::-1] #正确 classSolution: defplusOne(self, digits: List[int]) -> List[int]: res = [] y = 0 y = 0 digits2 = digits[::-1] for i inrange(len(digits2)): if i == 0: v = (digits2[i] + y + 1) % 10 y = (digits2[i] + y + 1) // 10 else: v = (digits2[i] + y) % 10 y = (digits2[i] + y) // 10 res.append(v) if y > 0: res.append(y) return res[::-1]
# v1 classSolution: defmultiply(self, A: int, B: int) -> int: return A*B # v2 classSolution: defmultiply(self, A: int, B: int) -> int: res = 0 while B: if B&1: res = res + A A = A + A B>>=1 return res # v3 classSolution: defmultiply(self, A: int, B: int) -> int: defdfs(A,B): if B==1: return A s = dfs(A,B//2) return s+s if B%2==0else s+s+A return dfs(A,B)
classSolution: defmissingNumber(self, nums: List[int]) -> int: n = len(nums) res = 0 for i inrange(n): res = res ^ i ^ nums[i] res ^= n return res # classSolution: defmissingNumber(self, nums: List[int]) -> int: r = 0 for i in nums: r ^= i for i inrange(len(nums)+1): r ^= i return r
classSolution: defsingleNumbers(self, nums: List[int]) -> List[int]: res = 0 for i in nums: res ^= i m = 1 while res & m==0: m <<=1 x = 0 y = 0 for i in nums: if i & m: x^=i else: y^=i return [x,y]
classSolution: defgetPermutation(self, n: int, k: int) -> str: import math toeken = [str(i) for i inrange(1,n+1)] k -= 1 res = "" while n > 0: n -= 1 a, k = divmod(k,math.factorial(n)) res += toeken.pop(a) return res
for k,f in [(x1,y1),(x2,y2),(x3,y3),(x4,y4)]: if k>x and k<x5 and f>y and f<y5: returnTrue returnFalse # 可以 classSolution: defisRectangleOverlap(self, rec1: List[int], rec2: List[int]) -> bool: x_overlap = not(rec1[2]<=rec2[0] or rec2[2]<=rec1[0]) y_overlap = not(rec1[3]<=rec2[1] or rec2[3]<=rec1[1]) return x_overlap and y_overlap
# 自己写的 classSolution: defmonotoneIncreasingDigits(self, n: int) -> int: defget_p_n(n): res = [] while n > 0: n, m = divmod(n, 10) res.append(m) return res[::-1] defget_index(res): for i inrange(len(res)-1): if res[i+1] < res[i]: return i else: return -1
defdfs(res): idx = get_index(res) if idx==-1: return res else: font = res[0:idx+1] font[-1] = font[-1]-1if font[-1]-1>=0else9 return dfs(font) + [9]*(len(res)-idx-1)
res = get_p_n(n) res2 = dfs(res) res3 = 0 for i in res2: res3 = res3*10 + i return res3 # 贪心做法 lass Solution: defmonotoneIncreasingDigits(self, N): n = str(N) num = [] for i in n: num.append(i)
nine = len(num) for i inrange(len(num) - 1, 0, -1): # 注意之类的操作 if num[i - 1] > num[i]: num[i - 1] = str(int(num[i - 1]) - 1) nine = i
num = ''.join(num) num = int(num[:nine] + '9' * (len(num) - nine)) return num
注意上面的操作,如果换成下面的代码会出错的,因此塔一边从后往前,一边会修改值。
1 2 3 4
for i in range(len(num) - 1): if num[i + 1] > num[i]: num[i] = str(int(num[i]) - 1) nine = i
classSolution: defcountDigitOne(self, n: int) -> int: a, b, one_count = 1, 10, 0 while n >= a: x, y = divmod(n, b) if y >= a * 2: one_count += (x + 1) * a elif y >= a: one_count += y + 1 + (x - 1) * a else: one_count += x * a
classSolution: defcountNumbersWithUniqueDigits(self, n: int) -> int: defpending_sum(x): res = 1 j = 10 for i inrange(x): res = res * min(9, j) j = j - 1 return res if n==0: return1 if n==1: return10
classSolution: deflastRemaining(self, n: int, m: int) -> int: x = 1 for i inrange(2, n+1): # 注意起始不是1 x = (x+m)%i return x # https://leetcode-cn.com/problems/yuan-quan-zhong-zui-hou-sheng-xia-de-shu-zi-lcof/solution/huan-ge-jiao-du-ju-li-jie-jue-yue-se-fu-huan-by-as/
# 方法一:迭代做法 classSolution: deflastRemaining(self, n: int) -> int: head = 1 step = 1 left = True while n > 1: # 从左边开始移除 or(从右边开始移除,数列总数为奇数) if left or n % 2 != 0: head += step step <<= 1# 步长 * 2 n >>= 1# 总数 / 2 left = not left #取反移除方向
return head # 方法二:递归做法 classSolution: deflastRemaining(self, n: int) -> int: defdfs(n,direction): if n==1: return1 else: if direction: return2*dfs(n//2, not direction) else: if n&1: return2*dfs(n//2, not direction) else: return2*dfs(n//2,not direction) - 1 return dfs(n, True)
classSolution: defsolveEquation(self, equation: str) -> str: low, high = equation.replace("-", "+-").split("=") a, b = 0, 0 # 处理左边 for i in low.split("+"): if i=='':continue if i.endswith('x'): if i[:-1] == '': a = a + 1 elif i[:-1] == '-': a = a - 1 else: a = a + int(i[:-1]) else: b = b + int(i) # 处理右边 for i in high.split("+"): if i=='':continue if i.endswith('x'): if i[:-1] == '': a = a - 1 elif i[:-1] == '-': a = a + 1 else: a = a - int(i[:-1]) else: b = b - int(i) if a == 0: return'Infinite solutions'if b == 0else'No solution' else: return'x=%d' % (-b / a)
classSolution: defnthUglyNumber(self, n: int) -> int: import heapq seen = set() res = [1] for i inrange(n-1): v = heapq.heappop(res) for j in [2,3,5]: if v*j notin seen: seen.add(v*j) heapq.heappush(res,v*j) return res[0]
for num in num_map: # 去除1 if num == 1: continue for key in res.copy(): # 暴力循环 构建数字 good_num = key * num # 判断是否为好子集 ifnotall( good_num % p for p in primes): continue
class Solution: def firstMissingPositive(self, nums: List[int]) -> int: size = len(nums) for i in range(size): # 先判断这个数字是不是索引,然后判断这个数字是不是放在了正确的地方 while 1 <= nums[i] <= size and i != nums[i] - 1: nums[nums[i]-1],nums[i] = nums[i], nums[nums[i]-1] for i in range(size): if i + 1 != nums[i]: return i + 1 return size + 1
class Solution: def firstMissingPositive(self, nums: List[int]) -> int: size = len(nums) for i in range(size): # 先判断这个数字是不是索引,然后判断这个数字是不是放在了正确的地方 while 1 <= nums[i] <= size and nums[i] != nums[nums[i] - 1]: nums[nums[i]-1],nums[i] = nums[i], nums[nums[i]-1] for i in range(size): if i + 1 != nums[i]: return i + 1 return size + 1
classSolution: deffindRepeatNumber(self, nums: List[int]) -> int: i = 0 while i < len(nums): if nums[i] == i: i = i + 1 continue if nums[nums[i]] == nums[i]: return nums[i] nums[nums[i]], nums[i] = nums[i], nums[nums[i]]
classSolution: deffindRepeatNumber(self, nums: List[int]) -> int: size = len(nums) for i inrange(size): while0<=nums[i]<=size-1and nums[i]!=nums[nums[i]]: nums[nums[i]],nums[i] = nums[i],nums[nums[i]] for i inrange(size): if i!=nums[i]: return nums[i]
还是要注意的是代码中的
1 2 3 4 5 6 7
for i inrange(size): while0<=nums[i]<=size-1and nums[i]!=nums[nums[i]]: nums[nums[i]],nums[i] = nums[i],nums[nums[i]] #不能写成如下的形式 for i inrange(size): while0<=nums[i]<=size-1and nums[i]!=nums[nums[i]]: nums[i],nums[nums[i]] = nums[nums[i]],nums[i]
如果要写的话也是可以的,只要在外面定义一个swap函数,就可以了。
丢失的数字
这道题可以使用^来做,解法如下:
1 2 3 4 5 6 7 8
classSolution: defmissingNumber(self, nums: List[int]) -> int: r = 0 for i in nums: r ^= i for i inrange(len(nums)+1): r ^= i return r
使用交换来做得话,结果如下:
1 2 3 4 5 6 7 8 9 10 11
classSolution: defmissingNumber(self, nums: List[int]) -> int: size = len(nums) for i inrange(size): while nums[i] <= size - 1and nums[i]!=nums[nums[i]]: nums[nums[i]], nums[i] = nums[i], nums[nums[i]] for i inrange(size): if i != nums[i]: return i return size
classSolution: deffindDuplicates(self, nums: List[int]) -> List[int]: res = [] n = len(nums) for i in nums: index = (i - 1)%n nums[index] += n for i inrange(len(nums)): if nums[i] > 2*n: res.append(i+1) return res
# 第一版-错的 classSolution: deffindDisappearedNumbers(self, nums: List[int]) -> List[int]: n = len(nums) for i inrange(n): index = nums[i] - 1 nums[index] += n res = [] for i inrange(n): if nums[i] < n: res.append(i) return res
错误原因在于
1 2 3 4 5 6 7 8 9 10 11
classSolution: deffindDisappearedNumbers(self, nums: List[int]) -> List[int]: n = len(nums) for i inrange(n): index = (nums[i] - 1)%n # 改动1 nums[index] += n res = [] for i inrange(n): if nums[i] <= n: # 改动2 res.append(i+1) # 改动3 return res
1 2 3 4 5 6 7 8 9 10 11
classSolution: deffindDisappearedNumbers(self, nums: List[int]) -> List[int]: n = len(nums) for i inrange(n): index = (nums[i] - 1)%n nums[index] += n res = [] for i inrange(n): if nums[i] <= n: res.append(i+1) return res
classSolution: defnextPermutation(self, nums: List[int]) -> None: """ Do not return anything, modify nums in-place instead. """ i = len(nums) -2 while i>=0and nums[i]>=nums[i+1]: i = i - 1 if i >= 0: j = len(nums) - 1 while j>=0and nums[i] >= nums[j]: j = j -1 nums[i], nums[j] = nums[j], nums[i] left = i + 1 right = len(nums) - 1 while left < right: nums[left], nums[right] = nums[right], nums[left] left = left + 1 right = right - 1