仅以此纪录每日LeetCode所刷题目。
题目描述:
示例:
思路:
这道题一开始的想法是使用模拟来解答,但是如果我们遇到'RRRRL'这种情况,我们在判断‘RL’相撞之后还需要回退到前面,因为前面的'RRRR'也有相撞,因此模拟方法相当麻烦,我们换一种思路。首先,如果directions串的前n个字符是'L',那么他们不会发生碰撞,我们可以将其剔除;同理如果directions串的后n个字符是'R',那么他们也不会发生碰撞,我们可以将其剔除。此时剩余的directions串中,一定会发生碰撞(除非串中全是'S')。此时,我们即可使用directions的长度,减去其中'S'字符的数量,就可以得到碰撞的次数了。最后还有两种特殊情况,即字符串中全是'R'或者全是'L',这个时候我们返回0即可。
代码:
class Solution:
def countCollisions(self, directions: str) -> int:
left = 0
right = 0
for i in range(len(directions)):
if directions[i] == 'R':
left = i
break
d1 = directions[::-1]
for j in range(len(directions)):
if d1[j] == 'L':
right = j
break
right = len(d1) - right
if left == right:
return 0
directions = directions[left:right]
if len(directions) == 1:
return 0
count = len(directions)
print
for i in range(len(directions)):
if directions[i] == 'S':
count -= 1
return count
题目描述:
示例:
思路:
这道题在做题的时候我写的方法都超时了,之后想到自己是没有考虑pattern中的两个字符串都相同的情况。因此我们需要首先讨论这两个字符相同的情况。因为字符相同,我们及其放在任何位置都可以,只需要求出原来的text串中pattern的数量即可。讨论第二种情况,此时我们需要分别求出text串中pattern[0]、pattern[1]的数目,之后取max(sum_a, sum_b)来判断应该放置a在前面还是b在后面,而遍历的时候我们同时可以得到pattern串的数目。
代码:
class Solution:
def maximumSubsequenceCount(self, text: str, pattern: str) -> int:
a, b = pattern[0], pattern[1]
#相同的时候直接计算
if a == b:
s = text.count(a)
return (s*s +s)//2
sum_a, sum_b, ans = 0, 0, 0
for n in text:
if n == a:
sum_a += 1
elif n == b:
sum_b += 1
ans += sum_a
#可以选择放一个a在最前,也可以选择放一个b在最后
return max(sum_a, sum_b) + ans
题目描述:
示例:
思路:
这道题就是求列表中存在多少个数小于前面的数同时小于后面的数(我们称之为谷),存在多少个数大于前面的数同时大于后面的数(我们称之为峰)。首先我们应该将列表中相邻的相同的数去掉,只留下相同数中的一个即可。之后我们遍历列表,求出峰和谷的数量即可得到答案。
代码:
class Solution:
def countHillValley(self, nums: List[int]) -> int:
num = [nums[0]]
for j in range(len(nums)-1):
if nums[j] != nums[j+1]:
num.append(nums[j])
if len(num) == 0:
num.append(nums[0])
if nums[-1] != num[-1]:
num.append(nums[-1])
if len(num) < 3:
return 0
count = 0
for i in range(1,len(num)-1):
if num[i-1]<num[i] and num[i]>num[i+1]:
count += 1
if num[i-1]>num[i] and num[i]<num[i+1]:
count += 1
return count
题目描述:
示例:
思路:
这道题我们直接使用字典存储,数字作为kay,数字的数量作为value。之后遍历value,存在奇数value即返回False,遍历完成之后即返回True。
代码:
class Solution:
def divideArray(self, nums: List[int]) -> bool:
dict1 = {}
for i in nums:
if i in dict1:
dict1[i] += 1
else:
dict1[i] = 1
for i in dict1.values():
if i%2 != 0:
return False
return True