力扣刷题记录——496. 下一个更大元素 I、500. 键盘行、506. 相对名次

本专栏主要记录力扣的刷题记录,备战蓝桥杯,供复盘和优化算法使用,也希望给大家带来帮助,博主是算法小白,希望各位大佬不要见笑,今天要分享的是——《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

猜你喜欢

转载自blog.csdn.net/weixin_63866037/article/details/128691530
今日推荐