5963. 反转两次的数字
这是我写的:执行用时: 32 ms,内存消耗: 14.9 MB
class Solution:
def isSameAfterReversals(self, num: int) -> bool:
if num == 0:
return True
return True if num % 10 != 0 else False
5964. 执行所有后缀指令
这题真的能看出来算法的博大精深,因为我的用时和大佬的差距太太太大了。
这是我写的:执行用时: 3056 ms,内存消耗: 15.1 MB
class Solution:
def executeInstructions(self, n: int, startPos: List[int], s: str) -> List[int]:
m = len(s)
ans = [0 for i in range(m)]
moves = {
"L":[0, -1],
"R":[0, 1],
"U":[-1, 0],
"D":[1, 0]
}
for i in range(m):
pos = startPos
move = moves[s[i]]
tmp = [pos[i] + move[i] for i in range(2)]
if (0 <= tmp[0] < n) and (0 <= tmp[1] < n):
for j in range(i+1, m):
move = moves[s[j]]
tmp = [tmp[i] + move[i] for i in range(2)]
if not (0 <= tmp[0] <= n-1 and 0 <= tmp[1] <= n-1):
ans[i] = j - i
break
if ans[i] == 0:
ans[i] = m - i
else:
ans[i] = 0
return ans
这是大佬写的:执行用时: 1016 ms,内存消耗: 15.1 MB,双100%
class Solution:
def executeInstructions(self, n: int, startPos: List[int], s: str) -> List[int]:
ans,d = [],{'R':(0,1),'L':(0,-1),'U':(-1,0),'D':(1,0)}
for i in range(len(s)):
ops,tmp = s[i:],0
x,y = startPos[0],startPos[1] # 初始坐标
for op in ops:
x,y = x+d[op][0],y+d[op][1]
if 0 <= x < n and 0<= y < n:tmp += 1 # 未出界+1
else:break # 出界直接停止
ans.append(tmp)
return ans
5965. 相同元素的间隔之和
大佬写的:执行用时: 320 ms,内存消耗: 48.4 MB
class Solution:
def getDistances(self, arr: List[int]) -> List[int]:
d, res = defaultdict(list), [0] * len(arr)
for i, x in enumerate(arr): d[x].append(i)
for x in d:
pi, n, c = 0, len(d[x]), sum(d[x])
for i, pn in enumerate(d[x]): res[(pi := pn)] = (c := c - (n - 2 * i) * (pn - pi))
return res
5966. 还原原数组
大佬写的:执行用时: 5256 ms,内存消耗: 16.2 MB
class Solution:
def recoverArray(self, nums: List[int]) -> List[int]:
nums.sort()
x2i = defaultdict(list)
for i, x in enumerate(nums):
x2i[x].append(i)
n = len(nums)
for i in range(n//2-1, n-1):
k_ = nums[-1] - nums[i]
if k_ % 2:
continue
x2i_ = copy.deepcopy(x2i)
valid = [True for _ in range(n)]
ans = []
for j in range(n-1):
if valid[j]:
target = nums[j]+k_
if len(x2i_[target]) >= 1:
ans.append(nums[j]+k_//2)
idx = x2i_[target].pop()
valid[idx] = False
else:
break
if len(ans) == n//2:
return ans