第 273 场周赛
Problem A - 反转两次的数字
方法一:观察
对于非零的数字,必须末尾不含零,也即不能被整除。
- 时间复杂度。
- 空间复杂度。
参考代码(Python 3)
class Solution:
    def isSameAfterReversals(self, num: int) -> bool:
        return num == 0 or num % 10 != 0
Problem B - 执行所有后缀指令
方法一:模拟
按要求模拟即可。
- 时间复杂度。
- 空间复杂度。
参考代码(Python 3)
class Solution:
    def executeInstructions(self, n: int, startPos: List[int], s: str) -> List[int]:
        d = {'L': (0, -1), 'R': (0, 1), 'U': (-1, 0), 'D': (1, 0)}
        ans = []
        for i in range(len(s)):
            cmd = 0
            r, c = startPos
            for j in range(i, len(s)):
                nr, nc = r + d[s[j]][0], c + d[s[j]][1]
                if 0 <= nr < n and 0 <= nc < n:
                    r, c = nr, nc
                    cmd += 1
                else:
                    break
            ans.append(cmd)
        return ans
Problem C - 相同元素的间隔之和
方法一:前缀和+单指针
每个数字单独处理,单指针移动过程中基于前缀和思想维护左右两端的贡献之和。
- 时间复杂度。
- 空间复杂度。
参考代码(Python 3)
class Solution:
    def getDistances(self, arr: List[int]) -> List[int]:
        d = collections.defaultdict(list)
        for i, num in enumerate(arr):
            d[num].append(i)
            
        ans = [0] * len(arr)
        for v in d.values():
            m = len(v)
            cval = sum(v) - v[0] * m
            for i, pos in enumerate(v):
                delta = v[i] - v[i - 1] if i >= 1 else 0
                cval += i * delta - (m - i) * delta
                ans[pos] = cval
            
        return ans
Problem D -还原原数组
方法一:哈希表
由于,最大的那个数必然是来自higher。在的数据规模下,直接枚举最大的那个数对应的lower中的数即可。
在确定了之后,基于哈希表,从最小的键开始依次处理即可。如果出现匹配不上的情况,就说明当前的值不对。
- 时间复杂度
- 空间复杂度
参考代码(Python 3)
class Solution:
    def recoverArray(self, nums: List[int]) -> List[int]:
        n = len(nums)
        nums.sort()
        keys = sorted(list(set(nums)))
        for i in range(n - 2, n // 2 - 2, -1):
            delta = nums[n - 1] - nums[i]
            if delta == 0 or delta % 2 == 1:
                continue
            cnt = collections.Counter(nums)
            ok = True
            ans = []
            for key in keys:
                if cnt[key] == 0:
                    continue
                if cnt[key + delta] < cnt[key]:
                    ok = False
                    break
                cnt[key + delta] -= cnt[key]
                ans += [key + delta // 2] * cnt[key]
                cnt[key] = 0
            if ok:
                return ans
        return []