给出题目一的试题链接如下:
这一题其实也简单,要使得两次反转之后是同一个数,其充要条件事实上这个数最后没有多余的0,因此我们只需要考虑一下其关于10的余数即可。
给出python代码实现如下:
class Solution:
def isSameAfterReversals(self, num: int) -> bool:
return num == 0 or num % 10 != 0
提交代码评测得到:耗时28ms,占用内存14.3MB。
给出题目二的试题链接如下:
这一题坦率地说我没啥好的思路,就是暴力地一个二重循环进行实现,暴力,但是简单有效……
给出python代码实现如下:
class Solution:
def executeInstructions(self, n: int, startPos: List[int], s: str) -> List[int]:
m = len(s)
res = [0 for _ in range(m)]
for i in range(m):
v, h = startPos
cnt = 0
for j in range(i, m):
if s[j] == "L":
h -= 1
elif s[j] == "R":
h += 1
elif s[j] == "U":
v -= 1
else:
v += 1
if 0 <= v < n and 0 <= h < n:
cnt += 1
else:
break
res[i] = cnt
return res
提交代码评测得到:耗时1532ms,占用内存14.4MB。
给出题目三的试题链接如下:
这一题思路其实也简单,就是拆成两步来进行实现,首先我们对每一个元素的idx位置进行统计,然后对一个元素,考察其所有的idx,对每一个idx更新其值。
而这个更新的算法其实也挺简单,所有的绝对值之差的和,事实上就是考虑正负关系,用一个累积数组就可以快速搞定了。
给出python代码实现如下:
class Solution:
def getDistances(self, arr: List[int]) -> List[int]:
n = len(arr)
mem = defaultdict(list)
for i, x in enumerate(arr):
mem[x].append(i)
res = [0 for _ in range(n)]
for idxs in mem.values():
m = len(idxs)
s, tot = 0, sum(idxs)
for i, idx in enumerate(idxs):
res[idx] = tot-idx-s*2 + idx*(i - (m-1-i))
s += idx
return res
提交代码评测得到:耗时1260ms,占用内存47.6MB。
给出题目四的试题链接如下:
这一题我的思路同样很暴力,首先最小的数一定是减去了一个k,那么我们遍历所有的元素就能得到所有可能的k值,那么剩下的我们就是考察对于任意一个给定的k,是否可以将数组进行拆分。
而这个问题就变得比较简单了。
给出python代码实现如下:
class Solution:
def recoverArray(self, nums: List[int]) -> List[int]:
cnt = Counter(nums)
keys = sorted(cnt.keys())
def try_k(k):
counter = deepcopy(cnt)
res = []
for x in keys:
if counter[x+2*k] < counter[x]:
return []
counter[x+2*k] -= counter[x]
res += [x+k] * counter[x]
return res
n = len(keys)
for i in range(1, n):
if (keys[i] - keys[0]) % 2 == 0:
k = (keys[i] - keys[0]) // 2
res = try_k(k)
if res != []:
return res
return []
提交代码评测得到:耗时5084ms,占用内存15MB。