LeetCode 520. 检测大写字母 / 677. 键值映射 / 319. 灯泡开关

Posted Zephyr丶J

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode 520. 检测大写字母 / 677. 键值映射 / 319. 灯泡开关相关的知识,希望对你有一定的参考价值。

520. 检测大写字母

2021.11.13 每日一题

题目描述

我们定义,在以下情况时,单词的大写用法是正确的:

  • 全部字母都是大写,比如 “USA” 。
  • 单词中所有字母都不是大写,比如 “leetcode” 。
  • 如果单词不只含有一个字母,只有首字母大写, 比如 “Google” 。

给你一个字符串 word 。如果大写用法正确,返回 true ;否则,返回 false 。

示例 1:

输入:word = “USA”
输出:true

示例 2:

输入:word = “FlaG”
输出:false

提示:

1 <= word.length <= 100
word 由小写和大写英文字母组成

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/detect-capital
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

思路

简单题,就简单处理了
学一下这两个判断大小写的方法

class Solution {
    public boolean detectCapitalUse(String word) {
        int l = word.length();
        if(l == 1)
            return true;
        //如果第一个是小写,第二个大写,直接false
        if(Character.isLowerCase(word.charAt(0)) && Character.isUpperCase(word.charAt(1)))
            return false;
        //剩下的情况,只有除了第一个字符的所有字符都是同样的,才正确
        //学一下官解,用异或判断
        for(int i = 2; i < l; i++){
            if(Character.isLowerCase(word.charAt(i)) ^ Character.isLowerCase(word.charAt(1)))
                return false;
        }
        return true;
    }
}

677. 键值映射

2021.11.14 每日一题

题目描述

实现一个 MapSum 类,支持两个方法,insert 和 sum:

  • MapSum() 初始化 MapSum 对象
  • void insert(String key, int val) 插入 key-val 键值对,字符串表示键 key ,整数表示值 val 。如果键 key 已经存在,那么原来的键值对将被替代成新的键值对。
  • int sum(string prefix) 返回所有以该前缀 prefix 开头的键 key 的值的总和。

示例:

输入:
[“MapSum”, “insert”, “sum”, “insert”, “sum”]
[[], [“apple”, 3], [“ap”], [“app”, 2], [“ap”]]
输出:
[null, null, 3, null, 5]
解释:
MapSum mapSum = new MapSum();
mapSum.insert(“apple”, 3);
mapSum.sum(“ap”); // return 3 (apple = 3)
mapSum.insert(“app”, 2);
mapSum.sum(“ap”); // return 5 (apple + app = 3 + 2 = 5)

提示:

1 <= key.length, prefix.length <= 50
key 和 prefix 仅由小写英文字母组成
1 <= val <= 1000
最多调用 50 次 insert 和 sum

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/map-sum-pairs
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

思路

因为字符串不多,字符串长度也不长,所以直接存储每一个前缀就OK
可以将哈希表换成字典树

class MapSum {
    Map<String, Integer> smap;
    Map<String, Integer> premap;
    public MapSum() {
        smap = new HashMap<>();
        premap = new HashMap<>();
    }
    
    public void insert(String key, int val) {
        int last = smap.getOrDefault(key, 0);
        smap.put(key, val);
        for(int i = 0; i < key.length(); i++){
            String temp = key.substring(0, i + 1);
            premap.put(temp, premap.getOrDefault(temp, 0) - last + val);
        }
    }
    
    public int sum(String prefix) {
        return premap.containsKey(prefix) ? premap.get(prefix) : 0;
    }
}

/**
 * Your MapSum object will be instantiated and called as such:
 * MapSum obj = new MapSum();
 * obj.insert(key,val);
 * int param_2 = obj.sum(prefix);
 */

本来不想写字典树了,想了一下,还是再练一下吧

class MapSum {
    class Trie{
        int val;
        Trie[] node = new Trie[26];
    }
    Map<String, Integer> map;
    Trie trie;

    public MapSum() {
        map = new HashMap<>();
        trie = new Trie();
    }
    
    public void insert(String key, int val) {
        int last = map.getOrDefault(key, 0);
        Trie root = trie;
        map.put(key, val);
        for(int i = 0; i < key.length(); i++){
            char c = key.charAt(i);
            if(root.node[c - 'a'] == null)
                root.node[c - 'a'] = new Trie();
            root = root.node[c - 'a'];
            root.val += val - last;
        }
    }
    
    public int sum(String prefix) {
        Trie root = trie;
        for(char c : prefix.toCharArray()){
            if(root.node[c - 'a'] == null)
                return 0;
            else{
                root = root.node[c - 'a'];
            }
        }
        return root.val;
    }
}

/**
 * Your MapSum object will be instantiated and called as such:
 * MapSum obj = new MapSum();
 * obj.insert(key,val);
 * int param_2 = obj.sum(prefix);
 */

319. 灯泡开关

2021.11.15 每日一题

题目描述

初始时有 n 个灯泡处于关闭状态。第一轮,你将会打开所有灯泡。接下来的第二轮,你将会每两个灯泡关闭一个。

第三轮,你每三个灯泡就切换一个灯泡的开关(即,打开变关闭,关闭变打开)。第 i 轮,你每 i 个灯泡就切换一个灯泡的开关。直到第 n 轮,你只需要切换最后一个灯泡的开关。

找出并返回 n 轮后有多少个亮着的灯泡。

示例 1:


输入:n = 3
输出:1
解释:
初始时, 灯泡状态 [关闭, 关闭, 关闭].
第一轮后, 灯泡状态 [开启, 开启, 开启].
第二轮后, 灯泡状态 [开启, 关闭, 开启].
第三轮后, 灯泡状态 [开启, 关闭, 关闭].
你应该返回 1,因为只有一个灯泡还亮着。

示例 2:

输入:n = 0
输出:0

示例 3:

输入:n = 1
输出:1

提示:

0 <= n <= 10^9

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/bulb-switcher
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

思路

想到因数,然后想到除了平方数,其他因数都是成对的,就领悟到真谛了

class Solution {
    public int bulbSwitch(int n) {
        //首先必须弄清楚提题意,先试试,应该就是第i个变化
        //试一下4,也就是第二轮,1 0 1 0;第三轮,1 0 0 0;第四轮 1 0 0 1,所以2
        //5, 1 0 1 0 1;第三轮,1 0 0 0 1; 第四轮,1 0 0 1 1,第五轮,1 0 0 1 0
        //6, 101010;100011;100111;100101;100100
        //7,1010101;1000111;1001111;1001011;1001001;1001000
        //8,10101010;10001110;10011111;10010111;10010000..
        //9,101010101;100011100;100111110;100100001
        //10,1001000010;11,10010000100;12,100100001000;13,1001000010000;14,10010000100000;
        //15,100100001000000;16,1001000010000001;17,18,
        //想想,有什么规律,就是看每个位置变了几次吗
        //也就是说每个数有多少个因数?但是这也太麻烦了,肯定过不了
        //举了这么多例子,终于想到了,因数有几个呢,如果是平方数,那么就会有偶数个公因数,所以这个位置的灯泡就是亮的
        //而其他位置,由于因数是成对的,所以就会熄灭
        long num = n;
        long i = 1;
        while(i * i <= n){
            i++;
        }
        return (int)(i - 1);
    }
}

以上是关于LeetCode 520. 检测大写字母 / 677. 键值映射 / 319. 灯泡开关的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode 520. 检测大写字母 / 677. 键值映射 / 319. 灯泡开关

LeetCode 520 检测大写字母[模拟] HERODING的LeetCode之路

520-检测大写字母

520. 检测大写字母

520. 检测大写字母

520. 检测大写字母