804.唯一摩尔斯密码词 & 1716.计算力扣银行的钱

154 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

题目

804.唯一摩尔斯密码词

题目大意

国际摩尔斯密码定义一种标准编码方式,将每个字母对应于一个由一系列点和短线组成的字符串, 比如:

  • 'a' 对应 ".-"
  • 'b' 对应 "-..."
  • 'c' 对应 "-.-." ,以此类推。

为了方便,所有 26 个英文字母的摩尔斯密码表如下:

[".-","-...","-.-.","-..",".","..-.","--.","....","..",".---","-.-",".-..","--","-.","---",".--.","--.-",".-.","...","-","..-","...-",".--","-..-","-.--","--.."]

给你一个字符串数组 words ,每个单词可以写成每个字母对应摩尔斯密码的组合。

  • 例如,"cab" 可以写成 "-.-..--..." ,(即 "-.-." + ".-" + "-..." 字符串的结合)。我们将这样一个连接过程称作 单词翻译

words 中所有单词进行单词翻译,返回不同 单词翻译 的数量。

样例

示例 1:

输入: words = ["gin", "zen", "gig", "msg"]
输出: 2
解释: 
各单词翻译如下:
"gin" -> "--...-."
"zen" -> "--...-."
"gig" -> "--...--."
"msg" -> "--...--."
​
共有 2 种不同翻译, "--...-.""--...--.".

示例 2:

输入:words = ["a"]
输出:1

数据规模

提示:

  • 1 <= words.length <= 100
  • 1 <= words[i].length <= 12
  • words[i] 由小写英文字母组成

思路

题目很简单,就是​个字母每个字母对应了一个摩斯密码​,然后把它们拼凑起来,看有多少种不同的摩斯密码​,很显然用哈希表会很方便,如果C++就可以直接使用unordered_set<string>mp之类的。不过这类偏字符串形式的题目用python,那真是太舒服了,直接将莫斯表复制进去,然后用set来存结果,最后输出len(set)即可。

代码

class Solution:
    def uniqueMorseRepresentations(self, words: List[str]) -> int:
        l=[".-","-...","-.-.","-..",".","..-.","--.","....","..",".---","-.-",".-..","--","-.","---",".--.","--.-",".-.","...","-","..-","...-",".--","-..-","-.--","--.."]
        ans=set([])
        for word in words:
            s=""
            for i in range(len(word)):
                s+=l[ord(word[i])-ord('a')]
            ans.add(s)
        return len(ans)

简化之后的代码:

class Solution:
    def uniqueMorseRepresentations(self, words: List[str]) -> int:
        l=[".-","-...","-.-.","-..",".","..-.","--.","....","..",".---","-.-",".-..","--","-.","---",".--.","--.-",".-.","...","-","..-","...-",".--","-..-","-.--","--.."]
        return len(set("".join(l[ord(x)-ord('a')] for x in word)for word in words))

题目

1716.计算力扣银行的钱

题目大意

Hercy 想要为购买第一辆车存钱。他 每天 都往力扣银行里存钱。

最开始,他在周一的时候存入 1 块钱。从周二到周日,他每天都比前一天多存入 1 块钱。在接下来每一个周一,他都会比 前一个周一 多存入 1 块钱。

给你 n ,请你返回在第 n 天结束的时候他在力扣银行总共存了多少块钱。

样例

img

数据规模

img

思路

根据题意得规律:sum=(1+2+3+4+5+6+7)+(2+3+4+5+6+7+8)+(3+4+...)+...sum=(1+2+3+4+5+6+7)+(2+3+4+5+6+7+8)+(3+4+...)+...,所以可以每7个数字为一个循环,然后设置一个初始值依次为1,2,3(可以由(i-1)/7来判断)

代码

class Solution {
public:
    int totalMoney(int n) {
        int sum=0;
        for(int i=1;i<=n;i++){
            int t=(i-1)/7,x=i%7+(i%7==0)*7;
            sum+=t+x;
        }
        return sum;
    }
};