本专栏主要记录力扣的刷题记录,备战蓝桥杯,供复盘和优化算法使用,也希望给大家带来帮助,博主是算法小白,希望各位大佬不要见笑,今天要分享的是——《力扣刷题记录——748. 最短补全词、744. 寻找比目标字母大的最小字母、747. 至少是其他数字两倍的最大数》。
目录
748. 最短补全词
题目描述
解题思路
解题代码
744. 寻找比目标字母大的最小字母
题目描述
解题思路
解题代码
747. 至少是其他数字两倍的最大数
题目描述
解题思路
解题代码
748. 最短补全词
题目描述
给你一个字符串
licensePlate
和一个字符串数组words
,请你找出words
中的 最短补全词 。补全词 是一个包含
licensePlate
中所有字母的单词。忽略licensePlate
中的 数字和空格 。不区分大小写。如果某个字母在licensePlate
中出现不止一次,那么该字母在补全词中的出现次数应当一致或者更多。例如:
licensePlate
= "aBc 12c"
,那么它的补全词应当包含字母'a'
、'b'
(忽略大写)和两个'c'
。可能的 补全词 有"abccdef"
、"caaacab"
以及"cbca"
。请返回
words
中的 最短补全词 。题目数据保证一定存在一个最短补全词。当有多个单词都符合最短补全词的匹配条件时取words
中 第一个 出现的那个。示例 1:
输入:licensePlate = "1s3 PSt", words = ["step", "steps", "stripe", "stepple"] 输出:"steps" 解释:最短补全词应该包括 "s"、"p"、"s"(忽略大小写) 以及 "t"。 "step" 包含 "t"、"p",但只包含一个 "s",所以它不符合条件。 "steps" 包含 "t"、"p" 和两个 "s"。 "stripe" 缺一个 "s"。 "stepple" 缺一个 "s"。 因此,"steps" 是唯一一个包含所有字母的单词,也是本例的答案。示例 2:
输入:licensePlate = "1s3 456", words = ["looks", "pest", "stew", "show"] 输出:"pest" 解释:licensePlate 只包含字母 "s" 。所有的单词都包含字母 "s" ,其中 "pest"、"stew"、和 "show" 三者最短。答案是 "pest" ,因为它是三个单词中在 words 里最靠前的那个。
解题思路
首先需要找出licenseplate中的字母,转化为小写字母储存起来。遍历所得到的字符串和words中的word,比较各字符出现的次数。最终用一个字典找出列表中所有符合条件的字符串中最短的那个,并将其返回。
解题代码
def shortestCompletingWord( licensePlate: str, words: list[str]) -> str:
temp_str = ""
temp_dic = {}
for i in licensePlate:
if i.isalpha():
temp_str+=i.lower()
# print(temp_str)
result = []
for word in words:
for j in set(temp_str):
target = 1
if temp_str.count(j) > word.count(j):
target = -1
break
if target == 1 :
result.append(word)
for i in result[::-1]:
temp_dic[len(i)] = i
# print(result)
# print(temp_dic)
return temp_dic[min(list(temp_dic.keys()))]
744. 寻找比目标字母大的最小字母
题目描述
给你一个字符数组
letters
,该数组按非递减顺序排序,以及一个字符target
。letters
里至少有两个不同的字符。返回
letters
中大于target
的最小的字符。如果不存在这样的字符,则返回letters
的第一个字符。示例 1:
输入: letters = ["c", "f", "j"],target = "a" 输出: "c" 解释:letters 中字典上比 'a' 大的最小字符是 'c'。示例 2:
输入: letters = ["c","f","j"], target = "c" 输出: "f" 解释:letters 中字典顺序上大于 'c' 的最小字符是 'f'。示例 3:
输入: letters = ["x","x","y","y"], target = "z" 输出: "x" 解释:letters 中没有一个字符在字典上大于 'z',所以我们返回 letters[0]。
解题思路
可以用ASCII码去比较,也可以自定义字典去比较,然后在进行遍历就可以了,如果存在直接返回,如果不存在返回letters[0]
解题代码
com_dic = {}
str_1 = "abcdefghijklmnopqrstuvwxyz"
str_2 =[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26]
for i in range(len(str_2)):
com_dic[str_1[i]] = str_2[i]
for letter in letters:
if com_dic[letter]>com_dic[target]:
return letter
return letters[0]
747. 至少是其他数字两倍的最大数
题目描述
给你一个整数数组
nums
,其中总是存在 唯一的 一个最大整数 。请你找出数组中的最大元素并检查它是否 至少是数组中每个其他数字的两倍 。如果是,则返回 最大元素的下标 ,否则返回
-1
。示例 1:
输入:nums = [3,6,1,0] 输出:1 解释:6 是最大的整数,对于数组中的其他整数,6 至少是数组中其他元素的两倍。6 的下标是 1 ,所以返回 1 。示例 2:
输入:nums = [1,2,3,4] 输出:-1 解释:4 没有超过 3 的两倍大,所以返回 -1 。示例 3:
输入:nums = [1] 输出:0 解释:因为不存在其他数字,所以认为现有数字 1 至少是其他数字的两倍。
解题思路
用sorted方法对列表排序,不会改变原来的列表的顺序,方便之后index索引。只要比较最大值和倒数第二大值之间的关系就可以了。
解题代码
def dominantIndex(nums: list[int]):
if len(nums)==1:
return 0
# sorted方法不会改变原来列表的顺序
nums_1 = sorted(nums)
max_num =nums_1[-1]
sed_max = nums_1[-2]
if max_num>=2*sed_max:
return nums.index(max_num)
else:
return -1