def myPow(self, x: float, n: int) -> float:
def pow_with_unsigned(x, n):
if n == 0:
return 1
if n == 1:
return x
ans = pow_with_unsigned(x, n>>1)
ans *= ans
if n & 1 == 1:
ans *= x
return ans
if n < 0:
return 1 / pow_with_unsigned(x, -n)
else:
return pow_with_unsigned(x, n)
打印呗,反正Python的int没有长度限制。
def print_n(n: int):
n = 10 ** (n)
for i in range(1, n):
print(i)
开始看到这题的思路是,要是能拿到父节点就好了,然后这道题需要别的思路,其关键在于复制
def deleteNode(self, node):
node.val = node.next.val # 4->1->1->9
node.next = node.next.next # 4->1->9
-
先考虑没有
*
的情况,通过一个递归逐个字符判断def match(text, pattern): if not pattern: return not text first_match = bool(text) and pattern[0] in {text[0], '.'} return first_match and match(text[1:], pattern[1:])
-
当
*
出现时,一定会在前面跟一个其他字符,所以一定会出现在pattern[1]的位置。一种情况是我们忽略这对pattern,因为可以出现0次;另一种情况是匹配上这个字符,用递归的方式匹配下一个。 -
一定要用f_match = bool(s),否则结果可能输出
''
def match(self, s, pattern): if not pattern: return not s f_match = bool(s) and pattern[0] in {s[0], '.'} if len(pattern) > 1 and pattern[1] == '*': return (self.match(s, pattern[2:]) or (f_match and self.match(s[1:], pattern))) else: return f_match and self.match(s[1:], pattern[1:])
此处留坑,排名第一的python答案暂时没有理解。
时间:O(n), 空间O(1)
def reOrderArray(self, array):
l, r = 0, len(array)-1
while l < r:
while l < r and array[l]&1 == 1:
l += 1
while l < r and array[r]&1 == 0:
r -= 1
array[l], array[r] = array[r], array[l]
看了一下没有通过牛客网的测试用例,因为题目有些不同,牛客网要求奇数和奇数,偶数和偶数之前的相对位置不变。
def reOrderArray(array):
return sorted(array, key=lambda x:x&1==0)
不使用sort
def reOrderArray(self, array):
from collections import deque
q = deque()
n = len(array)
for i in range(n):
if array[-i-1] & 1 == 1: # 从后找奇数
q.appendleft(array[-i-1])
if array[i] & 1 == 0: #从前找偶数
q.append(array[i])
return q