遍历:
class Solution:
def isAcronym(self, words: List[str], s: str) -> bool:
# 遍历
if len(words) != len(s):
return False
for i in range(len(words)):
if words[i][0] != s[i]:
return False
return True
另外,灵神的题解代码(. - 力扣(LeetCode)) 如下:
class Solution:
def isAcronym(self, words: List[str], s: str) -> bool:
return len(words) == len(s) and all(w[0] == c for w, c in zip(words, s))
其中对其中的all()函数作如下解释:
括号内部是生成器结构,生成True或False。当括号内可迭代对象全为True时,all函数整体为True,否则为False;另外当可迭代对象为空时,返回True。当 all(w[0] == c for w, c in zip(words, s))
中出现了False,all函数会立即停止遍历,并返回False。这是因为all 函数采用短路求值的方式,只要遇到一个元素为假,就会立即停止遍历并返回结果。所以该代码并不会比上一个代码运行时间长(是因为博主当时突然有这个疑问,所以特地去查了一下)。
思路分析:我当时看到这道题第一反应是排序,下标即为个数。但是nums【j】要小于nums【i】(不能等于),且位置不能变,所以排序不行(感觉比较麻烦)。而且要考虑比排序时复更低的方法。然后我想到了遍历列表存储(即哈希数组),再切片求和。既能达到目的,时复也更低。
遍历+哈希数组+切片:
class Solution:
def smallerNumbersThanCurrent(self, nums: List[int]) -> List[int]:
# 遍历 哈希数组
hash = [0]*101
for x in nums:
hash[x] += 1
return [sum(hash[:x]) for x in nums]
1.排序
class Solution:
def targetIndices(self, nums: List[int], target: int) -> List[int]:
# 排序
nums.sort()
ans = []
for i in range(len(nums)):
if nums[i] == target:
while i < len(nums) and nums[i] == target:
ans.append(i)
i += 1
break
return ans
2.遍历 统计数量,时复O(n)。
class Solution:
def targetIndices(self, nums: List[int], target: int) -> List[int]:
# 遍历 统计小于target的个数和等于target的个数
cnt = 0 # 等于的个数
idx = 0 # 小于的个数 即为下标
for x in nums:
if x < target:
idx += 1
elif x == target:
cnt += 1
return list(range(idx,idx+cnt))
1.排序
class Solution:
def canMakeArithmeticProgression(self, arr: List[int]) -> bool:
# 排序
arr.sort()
gap = arr[1] - arr[0]
for i in range(2,len(arr)):
if arr[i] - arr[i-1] != gap:
return False
return True
2.数学解法,时复O(n),参考官方题解下评论(. - 力扣(LeetCode)),代码如下:
class Solution:
def canMakeArithmeticProgression(self, arr: List[int]) -> bool:
# 数学解法
a,b = inf,-inf #最小值,最大值;注意这里要初始正负无穷,因为会有负数
for x in arr:
if x < a:
a = x
if x > b:
b = x
if a == b: # 常数列
return True
if (b-a) % (len(arr)-1) != 0: # An = A1 + (n-1)d
return False
d = (b-a) // (len(arr)-1)
flag = [0]*len(arr) #记录出现过没
for x in arr:
if (x-a) % d != 0:
return False
if flag[(x-a) // d] != 0: # A0 A1 ... Ai ... An-1 # i为下标
return False
flag[(x-a) // d] = 1
return True
感谢你看到这里!一起加油吧!