力扣刷题记录——804. 唯一摩尔斯密码词、806. 写字符串需要的行数、824. 山羊拉丁文

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

力扣刷题记录——804. 唯一摩尔斯密码词、806. 写字符串需要的行数、824. 山羊拉丁文_第1张图片

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]

力扣刷题记录——804. 唯一摩尔斯密码词、806. 写字符串需要的行数、824. 山羊拉丁文_第2张图片

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:]

力扣刷题记录——804. 唯一摩尔斯密码词、806. 写字符串需要的行数、824. 山羊拉丁文_第3张图片

 

你可能感兴趣的:(蓝桥杯刷题,leetcode,蓝桥杯,算法)