本专栏主要记录力扣的刷题记录,备战蓝桥杯,供复盘和优化算法使用,也希望给大家带来帮助,博主是算法小白,希望各位大佬不要见笑,今天要分享的是——《496. 下一个更大元素 I、500. 键盘行、506. 相对名次》。
目录
496. 下一个更大元素 I
题目描述
解题思路
解题代码
500. 键盘行
题目描述
解题思路
解题代码
506. 相对名次
题目描述
解题思路
解题代码
496. 下一个更大元素 I
题目描述
nums1
中数字x
的 下一个更大元素 是指x
在nums2
中对应位置 右侧 的 第一个 比x
大的元素。给你两个 没有重复元素 的数组
nums1
和nums2
,下标从 0 开始计数,其中nums1
是nums2
的子集。对于每个
0 <= i < nums1.length
,找出满足nums1[i] == nums2[j]
的下标j
,并且在nums2
确定nums2[j]
的 下一个更大元素 。如果不存在下一个更大元素,那么本次查询的答案是-1
。返回一个长度为
nums1.length
的数组ans
作为答案,满足ans[i]
是如上所述的 下一个更大元素 。示例 1:
输入:nums1 = [4,1,2], nums2 = [1,3,4,2]. 输出:[-1,3,-1] 解释:nums1 中每个值的下一个更大元素如下所述: - 4 ,用加粗斜体标识,nums2 = [1,3,4,2]。不存在下一个更大元素,所以答案是 -1 。 - 1 ,用加粗斜体标识,nums2 = [1,3,4,2]。下一个更大元素是 3 。 - 2 ,用加粗斜体标识,nums2 = [1,3,4,2]。不存在下一个更大元素,所以答案是 -1 。示例 2:
输入:nums1 = [2,4], nums2 = [1,2,3,4]. 输出:[3,-1] 解释:nums1 中每个值的下一个更大元素如下所述: - 2 ,用加粗斜体标识,nums2 = [1,2,3,4]。下一个更大元素是 3 。 - 4 ,用加粗斜体标识,nums2 = [1,2,3,4]。不存在下一个更大元素,所以答案是 -1 。
解题思路
遍历整个num1,取出num1中每一个元素i,以i的索引将nums2分割,在分割完的列表中找出第一个比i大的元素,如果没有找到那么返回-1。
解题代码
def nextGreaterElement(nums1,nums2):
fin_list = []
for i in nums1:
for j in nums2[nums2.index(i)::]:
if j > i :
fin_list.append(j)
break
elif nums2.index(j) == len(nums2)-1:
fin_list.append(-1)
return fin_list
500. 键盘行
题目描述
给你一个字符串数组
words
,只返回可以使用在 美式键盘 同一行的字母打印出来的单词。键盘如下图所示。美式键盘 中:
- 第一行由字符
"qwertyuiop"
组成。- 第二行由字符
"asdfghjkl"
组成。- 第三行由字符
"zxcvbnm"
组成。示例 1:
输入:words = ["Hello","Alaska","Dad","Peace"] 输出:["Alaska","Dad"]示例 2:
输入:words = ["omk"] 输出:[]示例 3:
输入:words = ["adsdf","sfd"] 输出:["adsdf","sfd"]
解题思路
首先遍历整个words,根据word的第一个字母判断是哪一行构成的,然后遍历word,如果有一个不在目标行的话,那么直接退出,如果到最后一个了,说明全部在目标杭,那么把它添加到目标列表中,最终返回这个目标列表。
解题代码
def findWords(words):
str_1 = "qwertyuiopQWERTYUIOP"
str_2 = "asdfghjklASDFGHJKL"
str_3 = "zxcvbnmZXCVBNM"
fin_target = []
for word in words:
first = word[0]
if first in str_1:
target_str = str_1
elif first in str_2:
target_str = str_2
else:
target_str = str_3
for i in range(0,len(word)):
if word[i] not in target_str:
break
# 已经到最后一个了
if i == len(word)-1:
fin_target.append(word)
return fin_target
506. 相对名次
题目描述
给你一个长度为
n
的整数数组score
,其中score[i]
是第i
位运动员在比赛中的得分。所有得分都 互不相同 。运动员将根据得分 决定名次 ,其中名次第
1
的运动员得分最高,名次第2
的运动员得分第2
高,依此类推。运动员的名次决定了他们的获奖情况:
- 名次第
1
的运动员获金牌"Gold Medal"
。- 名次第
2
的运动员获银牌"Silver Medal"
。- 名次第
3
的运动员获铜牌"Bronze Medal"
。- 从名次第
4
到第n
的运动员,只能获得他们的名次编号(即,名次第x
的运动员获得编号"x"
)。使用长度为
n
的数组answer
返回获奖,其中answer[i]
是第i
位运动员的获奖情况。示例 1:
输入:score = [5,4,3,2,1] 输出:["Gold Medal","Silver Medal","Bronze Medal","4","5"] 解释:名次为 [1st, 2nd, 3rd, 4th, 5th] 。示例 2:
输入:score = [10,3,8,9,4] 输出:["Gold Medal","5","Bronze Medal","Silver Medal","4"] 解释:名次为 [1st, 5th, 3rd, 2nd, 4th] 。
解题思路
首先想到的是字典,字典的查询速度非常快,用列表排序的方式将键和值关联起来,再利用切片对列表拷贝一份,用拷贝之后的列表遍历,查询字典中的值,将查询到的值添加到目标列表中,最后将目标列表返回。
解题代码
def findRelativeRanks(score):
score_copy = score[::]
fin_score = []
fin_dic = {}
result = []
score.sort(reverse=-1)
for i in range(1,len(score)+1):
if i == 1:
fin_score.append("Gold Medal")
elif i == 2:
fin_score.append("Silver Medal")
elif i == 3:
fin_score.append("Bronze Medal")
else:
fin_score.append(str(i))
for i in range(0,len(score)):
fin_dic[score[i]] = fin_score[i]
for i in score_copy:
result.append(fin_dic[i])
return result