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。
解题代码
1. def nextGreaterElement(nums1,nums2): 2. fin_list = [] 3. for i in nums1: 4. for j in nums2[nums2.index(i)::]: 5. if j > i : 6. fin_list.append(j) 7. break 8. elif nums2.index(j) == len(nums2)-1: 9. fin_list.append(-1) 10. 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,如果有一个不在目标行的话,那么直接退出,如果到最后一个了,说明全部在目标杭,那么把它添加到目标列表中,最终返回这个目标列表。
解题代码
1. def findWords(words): 2. str_1 = "qwertyuiopQWERTYUIOP" 3. str_2 = "asdfghjklASDFGHJKL" 4. str_3 = "zxcvbnmZXCVBNM" 5. fin_target = [] 6. for word in words: 7. first = word[0] 8. if first in str_1: 9. target_str = str_1 10. elif first in str_2: 11. target_str = str_2 12. else: 13. target_str = str_3 14. for i in range(0,len(word)): 15. if word[i] not in target_str: 16. break 17. # 已经到最后一个了 18. if i == len(word)-1: 19. fin_target.append(word) 20. 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] 。
解题思路
首先想到的是字典,字典的查询速度非常快,用列表排序的方式将键和值关联起来,再利用切片对列表拷贝一份,用拷贝之后的列表遍历,查询字典中的值,将查询到的值添加到目标列表中,最后将目标列表返回。
解题代码
1. def findRelativeRanks(score): 2. score_copy = score[::] 3. fin_score = [] 4. fin_dic = {} 5. result = [] 6. score.sort(reverse=-1) 7. for i in range(1,len(score)+1): 8. if i == 1: 9. fin_score.append("Gold Medal") 10. elif i == 2: 11. fin_score.append("Silver Medal") 12. elif i == 3: 13. fin_score.append("Bronze Medal") 14. else: 15. fin_score.append(str(i)) 16. for i in range(0,len(score)): 17. fin_dic[score[i]] = fin_score[i] 18. for i in score_copy: 19. result.append(fin_dic[i]) 20. return result