1. 题目一
给出题目一的试题链接如下:
1. 解题思路
这一题就是按照题目翻译一下,首先生成组装后的数字,然后看一下是否满足题意即可。
2. 代码实现
给出python代码实现如下:
class Solution:
def isFascinating(self, n: int) -> bool:
s = str(n) + str(2*n) + str(3*n)
return len(s) == 9 and len(set(s)) == 9 and "0" not in s
提交代码评测得到:耗时57ms,占用内存16.2MB。
2. 题目二
给出题目二的试题链接如下:
1. 解题思路
这一题思路上用一个滑动数组就能解决,我们记录下每一个连续两元素相同的pair出现的位置,然后考察以每一个位置作为终点时,其最大可取的开头位置在哪即可。
而这个位置就是当前倒数第二个连续pair的靠后位置。
2. 代码实现
给出python代码实现如下:
class Solution:
def longestSemiRepetitiveSubstring(self, s: str) -> int:
res = 1
cons = []
n = len(s)
for i in range(1, n):
if s[i] == s[i-1]:
cons.append(i-1)
if len(cons) >= 2:
res = max(res, i - cons[-2])
else:
res = max(res, i+1)
return res
提交代码评测得到:耗时101ms,占用内存16.4MB。
3. 题目三
给出题目三的试题链接如下:
1. 解题思路
这一题考虑到其规则,事实上我们只需要将初始位置按照方向加d或者减d就是最终的位置,此时,问题就是求一下两两的距离之和。
这个问题就比较简单了,排序之后用一个累积数组即可求解。
2. 代码实现
给出python代码实现如下:
class Solution:
def sumDistance(self, nums: List[int], s: str, d: int) -> int:
MOD = 10**9 + 7
for i, ch in enumerate(s):
if ch == "R":
nums[i] += d
else:
nums[i] -= d
nums = sorted(nums)
res = 0
n = len(nums)
s = sum(nums)
for i, x in enumerate(nums):
res = (res + s - (n-i) * x) % MOD
s -= x
return res
提交代码评测得到:耗时516ms,占用内存29.5MB。
4. 题目四
给出题目四的试题链接如下:
1. 解题思路
这一题一开始被唬到了,以至于没能搞定。结果看了大佬们的解答之后发现自己傻了,只能说睡眠不好影响思考能力……
这道题看似复杂,但是其实答案就两种可能性:
- 存在某一行全部为0;
- 存在两行,他们没有同一列元素都为1;
不难论证,对于其他可能的答案,其中必然包含上述两种情况,因此,我们本质上只要看看有没有全零行或者互补的行即可。
而鉴于列数不超过5,因此,事实上我们可以将每一行视为一个具体的数的二进制表达,然后用位运算即可快速得到答案了。
2. 代码实现
给出python代码实现如下:
class Solution:
def goodSubsetofBinaryMatrix(self, grid: List[List[int]]) -> List[int]:
nums = defaultdict(int)
for i, line in enumerate(grid):
num = 0
for digit in line:
num = num * 2 + digit
if num not in nums:
nums[num] = i
if 0 in nums:
return [nums[0]]
keys = list(nums.keys())
n = len(keys)
for i in range(n-1):
for j in range(i+1, n):
if keys[i] & keys[j] == 0:
return [nums[keys[i]], nums[keys[j]]]
return []
提交代码评测得到:耗时1818ms,占用内存20.5MB。