本专栏主要记录力扣的刷题记录,备战蓝桥杯,供复盘和优化算法使用,也希望给大家带来帮助,博主是算法小白,希望各位大佬不要见笑,今天要分享的是——《力扣刷题记录——804. 唯一摩尔斯密码词、806. 写字符串需要的行数、824. 山羊拉丁文》。
目录
804. 唯一摩尔斯密码词
题目描述
解题思路
解题代码
806. 写字符串需要的行数
题目描述
解题思路
解题代码
824. 山羊拉丁文
题目描述
解题思路
解题代码
804. 唯一摩尔斯密码词
题目描述
国际摩尔斯密码定义一种标准编码方式,将每个字母对应于一个由一系列点和短线组成的字符串, 比如:
'a'
对应".-"
,'b'
对应"-..."
,'c'
对应"-.-."
,以此类推。为了方便,所有
26
个英文字母的摩尔斯密码表如下:[".-","-...","-.-.","-..",".","..-.","--.","....","..",".---","-.-",".-..","--","-.","---",".--.","--.-",".-.","...","-","..-","...-",".--","-..-","-.--","--.."]给你一个字符串数组
words
,每个单词可以写成每个字母对应摩尔斯密码的组合。
- 例如,
"cab"
可以写成"-.-..--..."
,(即"-.-."
+".-"
+"-..."
字符串的结合)。我们将这样一个连接过程称作 单词翻译 。对
words
中所有单词进行单词翻译,返回不同 单词翻译 的数量。示例 1:
输入: words = ["gin", "zen", "gig", "msg"] 输出: 2 解释: 各单词翻译如下: "gin" -> "--...-." "zen" -> "--...-." "gig" -> "--...--." "msg" -> "--...--." 共有 2 种不同翻译, "--...-." 和 "--...--.".示例 2:
输入:words = ["a"] 输出:1
解题思路
首先根据字典的映射关系,将小写字母转化为摩斯密码,得到目标字典。遍历所给列表中的每个单词的每个字母,在字典中查找,将返回结果每个单词拼在一起,用一个列表容纳,最终用set返回这个列表中不重复的元素个数。
解题代码
def uniqueMorseRepresentations(words: list[str]):
list_1 = [".-", "-...", "-.-.", "-..", ".", "..-.", "--.", "....", "..", ".---", "-.-", ".-..", "--", "-.", "---", ".--.",
"--.-", ".-.", "...", "-", "..-", "...-", ".--", "-..-", "-.--", "--.."]
list_2 = ["abcdefghijklmnopqrstuvwxyz"]
str_dic = {}
for i in range(len(list_1)):
str_dic[list_2[0][i]] = list_1[i]
result = []
for word in words:
temp_str = ""
for j in word:
temp_str += str_dic[j]
result.append(temp_str)
return len(set(result))
806. 写字符串需要的行数
题目描述
我们要把给定的字符串
S
从左到右写到每一行上,每一行的最大宽度为100个单位,如果我们在写某个字母的时候会使这行超过了100 个单位,那么我们应该把这个字母写到下一行。我们给定了一个数组widths
,这个数组 widths[0] 代表 'a' 需要的单位, widths[1] 代表 'b' 需要的单位,..., widths[25] 代表 'z' 需要的单位。现在回答两个问题:至少多少行能放下
S
,以及最后一行使用的宽度是多少个单位?将你的答案作为长度为2的整数列表返回。示例 1: 输入: widths = [10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10] S = "abcdefghijklmnopqrstuvwxyz" 输出: [3, 60] 解释: 所有的字符拥有相同的占用单位10。所以书写所有的26个字母, 我们需要2个整行和占用60个单位的一行。示例 2: 输入: widths = [4,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10] S = "bbbcccdddaaa" 输出: [2, 4] 解释: 除去字母'a'所有的字符都是相同的单位10,并且字符串 "bbbcccdddaa" 将会覆盖 9 * 10 + 2 * 4 = 98 个单位. 最后一个字母 'a' 将会被写到第二行,因为第一行只剩下2个单位了。 所以,这个答案是2行,第二行有4个单位宽度。
解题思路
首先根据字典的特性,将字母转化为对应的数字。涉及到列表内部的运算用指针更加方便,当当前和小于等于100,而再加下一个值时大于一百,行数+1,并且,下一个值为下一行的开始值。如果while循化结束count任然等于一,说明没有出现换行的情况,直接return,否则继续判断。如果最后一行正好到字符串最后一个结束,那么返回所有和和行数,否则需要对最后一行进行求和。
解题代码
def numberOfLines(widths: list[int], s: str) -> list[int]:
str_1 = "abcdefghijklmnopqrstuvwxyz"
str_dic = {}
for i in range(len(widths)):
str_dic[str_1[i]] = widths[i]
# 定义指针
l_p = 0
count = 0
temp_all = 0
target_list = []
while l_p<=len(s)-2:
temp_all += str_dic[s[l_p]]
if (temp_all<=100) and (temp_all + str_dic[s[l_p + 1]] >100):
# 行数+1
count += 1
target_list.append(l_p+1)
# l_p += count+1
temp_all = 0
# l_p += 1
l_p += 1
if count == 0:
return [1,temp_all+str_dic[s[l_p]]]
if len(s) == target_list[-1]:
pass
else:
count += 1
if target_list == []:
return [count,temp_all]
rest_list = s[target_list[-1]::]
fin_result = 0
for i in rest_list:
fin_result += str_dic[i]
return [count,fin_result]
824. 山羊拉丁文
题目描述
给你一个由若干单词组成的句子
sentence
,单词间由空格分隔。每个单词仅由大写和小写英文字母组成。请你将句子转换为 “山羊拉丁文(Goat Latin)”(一种类似于 猪拉丁文 - Pig Latin 的虚构语言)。山羊拉丁文的规则如下:
- 如果单词以元音开头(
'a'
,'e'
,'i'
,'o'
,'u'
),在单词后添加"ma"
。
- 例如,单词
"apple"
变为"applema"
。- 如果单词以辅音字母开头(即,非元音字母),移除第一个字符并将它放到末尾,之后再添加
"ma"
。
- 例如,单词
"goat"
变为"oatgma"
。- 根据单词在句子中的索引,在单词最后添加与索引相同数量的字母
'a'
,索引从1
开始。
- 例如,在第一个单词后添加
"a"
,在第二个单词后添加"aa"
,以此类推。返回将
sentence
转换为山羊拉丁文后的句子。示例 1:
输入:sentence = "I speak Goat Latin" 输出:"Imaa peaksmaaa oatGmaaaa atinLmaaaaa"示例 2:
输入:sentence = "The quick brown fox jumped over the lazy dog" 输出:"heTmaa uickqmaaa rownbmaaaa oxfmaaaaa umpedjmaaaaaa overmaaaaaaa hetmaaaaaaaa azylmaaaaaaaaa ogdmaaaaaaaaaa"
解题思路
首先定义元音列表,判断单词的首字母是不是元音字母,if-else分支判断,在判断之前需要split一下,最后一不要忘记添加空格就可以了。中间具体怎么添加,添加什么,根据题目要求来就可以了。
解题代码
def toGoatLatin(sentence: str) -> str:
list_1 = ['a', 'e', 'i', 'o', 'u',"A","E","I","O","U"]
result = ""
count = 0
for i in sentence.split(" "):
if i == " ":
result += " "
else:
count += 1
if i[0] in list_1:
i += "ma"
else:
if len(i) == 1:
i += "ma"
else:
temp = i[0]
# print(i[1::])
i = i[1::]
i += temp
i += "ma"
i += "a"*count
i += " "
result += i
return result[:-1:]