每日三题-电话号码的字母组合、字母异位词分组、找到所有数组中消失的数字

简介: 每日三题电话号码的字母组合字母异位词分组找到所有数组中消失的数字

电话号码的字母组合


0e36e6495ddb48c0970e4fe597e8b85e.png


解法一

dfs

每次把当前数字的情况都列举出来

然后深搜

e05be4b0c9d8489a812836f24142cca0.png

class Solution {
    public List<String> letterCombinations(String digits) {
        List<String> list = new ArrayList<>();
        if(digits == null) return null;
        if("".equals(digits))return list;
        StringBuilder sb = new StringBuilder();
        HashMap<Character,String> map = new HashMap<>();
        map.put('2',"abc");
        map.put('3',"def");
        map.put('4',"ghi");
        map.put('5',"jkl");
        map.put('6',"mno");
        map.put('7',"pqrs");
        map.put('8',"tuv");
        map.put('9',"wxyz");
        dfs(digits,map,0,sb,list);
        return list;
    }
    public void dfs(String digits, HashMap<Character,String> map, int index, StringBuilder sb, List<String> list){
        if(sb.length() == digits.length()){
            list.add(sb.toString());
            return;
        }
        String s = map.get(digits.charAt(index));
        for(int i = 0;i < s.length();i++){
            sb.append(s.charAt(i));
            dfs(digits,map,index+1,sb,list);
            sb.deleteCharAt(index);
        }
    }
}

解法二

队列

队列中保存当前已经匹配好的字符串

每次把队列中的字符串都与当前字符的多种情况做匹配然后新增入队列

a68d303614d0433a9b0affdef5f066fc.png

class Solution {
    public List<String> letterCombinations(String digits) {
        List<String> list = new ArrayList<>();
        int len = digits.length();
        if(digits == null) return null;
        if(len == 0)return list;
        HashMap<Character,String> map = new HashMap<>();
        LinkedList<String> queue = new LinkedList<>();
        map.put('2',"abc");
        map.put('3',"def");
        map.put('4',"ghi");
        map.put('5',"jkl");
        map.put('6',"mno");
        map.put('7',"pqrs");
        map.put('8',"tuv");
        map.put('9',"wxyz");
        String s = map.get(digits.charAt(0));
        for(int i = 0;i < s.length();i++){
            queue.add(String.valueOf(s.charAt(i)));
        }
        for(int i = 1;i < digits.length();i++){
            int size = queue.size();
            s = map.get(digits.charAt(i));
            for(int j = 0;j < size;j++){
                String t = queue.pollLast();
                for(int k = 0;k < s.length();k++){
                    queue.addFirst(t+s.charAt(k));
                }
            }
        }
        while(!queue.isEmpty()){
            list.add(queue.pop());
        }
        return list;
    }
}


字母异位词分组


7bc2b81b5f76495e93f35acbd8e7d496.png

解法一

使用HashMap,map中的value就为字母异位词的List,所以需要找到一个唯一的key来区分List

而字母异位词中的字母出现的次数是一致的所以使用字母出现次数作为key来区分

class Solution {
    public List<List<String>> groupAnagrams(String[] strs) {
        HashMap<String,List<String>> map = new HashMap<>();
        List<List<String>> list = new ArrayList<>();
        for(int i = 0;i < strs.length;i++){
            int [] count = new int[26];
            for(int j = 0;j < strs[i].length();j++){
                count[strs[i].charAt(j)-'a']++;
            }
            StringBuilder sb = new StringBuilder();
            for(int j = 0;j< 26;j++){
                if(count[j] != 0){
                    sb.append((char)('a'+j));
                    sb.append(count[j]);
                }
            }
            List<String> l = map.get(sb.toString());
            if(l == null){
                List<String> t = new ArrayList<String>();
                t.add(strs[i]);
                map.put(sb.toString(),t);
            }else{
                l.add(strs[i]);
            }
        }
        if(!map.isEmpty()){
            Set<String> set = map.keySet();
            for(String t : set){
                List<String> tlist = map.get(t);
                list.add(tlist);
            }  
        }
        return list;
    }
}


找到所有数组中消失的数字04f417b14021457ca7501c6f2a6c9228.png

解法一

暴力遍历

class Solution {
    public List<Integer> findDisappearedNumbers(int[] nums) {
        int n = nums.length;
        int[] res =  new int[n+1];
        for(int i = 0;i < n;i++){
            res[nums[i]] = 1;
        }
        List<Integer> ans = new ArrayList<>();
        for(int i = 1;i <= n;i++){
            if(res[i] == 0){
                ans.add(i);
            }
        }
        return ans;
    }
}

解法二

使用原来的数组不新建数组

class Solution {
    public List<Integer> findDisappearedNumbers(int[] nums) {
        int n = nums.length;
        for(int i = 0;i < n;i++){
            int index = (nums[i]-1)%n;
            nums[index] +=n;
        }
        List<Integer> ans = new ArrayList<>();
        for(int i = 0;i < n;i++){
            if(nums[i] <= n){
                ans.add(i+1);
            }
        }
        return ans;
    }
}


相关文章
|
索引
【LeetCode】917. 仅仅反转字母、387. 字符串中的第一个唯一字符
目录 917. 仅仅反转字母 387. 字符串中的第一个唯一字符
61 0
|
5月前
判断输入的字母是元音,还是辅音
【10月更文挑战第15天】判断输入的字母是元音,还是辅音。
61 5
|
7月前
|
存储 算法
LeetCode第49题字母异位词分组
LeetCode第49题"字母异位词分组"的解题方法,通过将每个字符串的字符排序后作为键存储在HashMap中,有效地将所有字母异位词分组。
LeetCode第49题字母异位词分组
|
7月前
|
算法
【算法】滑动窗口——找到字符串中所有字母异位词
【算法】滑动窗口——找到字符串中所有字母异位词
|
5月前
|
存储
Leetcode第49题(字母异位词分组)
LeetCode第49题要求将字符串数组中的字母异位词分组,可以通过将每个字符串排序后作为键存入哈希表,最后将哈希表中的值添加到结果列表中来实现。
36 1
|
5月前
|
前端开发 JavaScript 安全
前端JS实现密码校验键盘横竖、26字母、相同字母、相同数字、密码包含用户名、数字 字母不能连续 不能相同三个、不能横向 竖向 连续三个 包含字符、不能有中文符号
该 JavaScript 代码实现了一个严格的密码校验功能,确保密码满足多种安全要求,包括长度、字符类型、不包含中文及特殊字符、不与用户名相似等。通过多个辅助函数,如 `validateFormat` 检查密码格式,`isHasChinaCharFun` 检测中文符号,`getCharAll` 生成键盘组合,以及 `checkPasswordFun` 综合验证密码的有效性和安全性。此工具对于提高用户账户的安全性非常有用。
192 0
|
10月前
输入一个字符,判断该字符是大写字母、小写字母,数字还是其他字符,并作相应的显示。
输入一个字符,判断该字符是大写字母、小写字母,数字还是其他字符,并作相应的显示。 提示:利用ord()函数来获得字符的 ASCIl。
216 1
输入一个字符,判断该字符是大写字母、小写字母,数字还是其他字符,并作相应的显示。
|
10月前
|
索引
leetcode-438:找到字符串中所有字母异位词
leetcode-438:找到字符串中所有字母异位词
49 0
|
10月前
leetcode-49:字母异位词分组
leetcode-49:字母异位词分组
59 0
|
算法
【算法专题突破】滑动窗口 - 找到字符串中所有字母异位词(14)
【算法专题突破】滑动窗口 - 找到字符串中所有字母异位词(14)
64 0