0
点赞
收藏
分享

微信扫一扫

力扣Day21

有点d伤 2022-02-03 阅读 72
leetcode

242、有效的字母异位词

给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。注意:若 s 和 t 中每个字符出现的次数都相同,则称 s 和 t 互为字母异位词。

判断map2.get(ch)和map1.get(ch)是否相等应该用equals,因为是Integer对象的,不然会出现错误。

即:正确用法:!map2.get(c).equals(map1.get(c))  

        错误用法:map2.get(ch)!=map1.get(ch)

判断相等:万金油equals !!!

法一:哈希表

class Solution {
    public boolean isAnagram(String s, String t) {
        Map<Character,Integer> map1=new HashMap<>();
        Map<Character,Integer> map2=new HashMap<>();
        for(int i=0;i<s.length();i++){
            char ch=s.charAt(i);
            if(!map1.containsKey(ch)){
                map1.put(ch,1);
            }else{
                map1.put(ch,map1.get(ch)+1);
            }
        }

        for(int i=0;i<t.length();i++){
            char ch=t.charAt(i);
            if(!map2.containsKey(ch)){
                map2.put(ch,1);
            }else{
                map2.put(ch,map2.get(ch)+1);
            }
        }

        if(map1.size()!=map2.size()){
            return false;
        }

        for(Character c:map1.keySet()){
            if(!map2.containsKey(c)){
                return false;
            }else if(map2.containsKey(c)&&!map2.get(c).equals(map1.get(c))){
                return false;
            }
        }
        return true;
    }
}

 法二:数组排序

class Solution {
    public boolean isAnagram(String s, String t) {
        if (s.length() != t.length()) {
            return false;
        }
        char[] str1 = s.toCharArray();
        char[] str2 = t.toCharArray();
        Arrays.sort(str1);
        Arrays.sort(str2);
        return Arrays.equals(str1, str2);
    }
}

官方哈希表做法

注意:getOrDefault() 方法获取指定 key 对应对 value,如果找不到 key ,则返回设置的默认值。

table.getOrDefault(ch, 0) 找到ch对应的value,如果找不到,就返回value为0

class Solution {
    public boolean isAnagram(String s, String t) {
        if (s.length() != t.length()) {
            return false;
        }
        Map<Character, Integer> table = new HashMap<Character, Integer>();
        for (int i = 0; i < s.length(); i++) {
            char ch = s.charAt(i);
            table.put(ch, table.getOrDefault(ch, 0) + 1);
        }
        for (int i = 0; i < t.length(); i++) {
            char ch = t.charAt(i);
            table.put(ch, table.getOrDefault(ch, 0) - 1);
            if (table.get(ch) < 0) {//如果有出现<0 说明肯定有一个字符是t特有的,不满足题目要求
                return false;
            }
        }
        return true;
    }
}

268、丢失的数字 

给定一个包含 [0, n] 中 n 个数的数组 nums ,找出 [0, n] 这个范围内没有出现在数组中的那个数。

 法一:List集合——时间复杂度O(n)

class Solution {
    public int missingNumber(int[] nums) {
        List<Integer>list=new ArrayList<>();
        for(int i=0;i<nums.length;i++){
            list.add(nums[i]);
        }

        for(int i=0;i<nums.length+1;i++){
            if(!list.contains(Integer.valueOf(i))){
                return i;
            }
        }
        return -1;
        
    }
}

法二:位运算(与136、只出现一次的数字有相似的思路)——时间复杂度O(n)

int res=num.length;是因为:

1)所有数字出现两次,异或将使它归零。

2)下标i是从0~nums.length-1的,而数字是从0~nums.length的(缺了一个)。

3)你需要将初始值,设置为下标不能达到的那个值,即nums.length

就是缺的那一个数必不可能是数组【0,n】共n 个数里的n

class Solution {
    public int missingNumber(int[] nums) {
        int res=nums.length;
        for(int i=0;i<nums.length;i++){
            res=res^nums[i]^i;
        }
        return res;
    }
}

法三:数组排序后逐个比较 时间复杂度O(nlogn)

class Solution {
    public int missingNumber(int[] nums) {
        Arrays.sort(nums);
        for(int i = 0; i < nums.length; i++){
            if(nums[i] != i) return i;
        }
        return nums.length;
        
    }
}

 

342、4的幂

给定一个整数,写一个函数来判断它是否是 4 的幂次方。如果是,返回 true ;否则,返回 false 。

整数 n 是 4 的幂次方需满足:存在整数 x 使得 n == 4^x

class Solution {
    public boolean isPowerOfFour(int n) {
        if(n<=0) return false;
        if(n==1) return true;

        while(n>1){
            if(n%4!=0){
                return false;
            }
            n=n/4;
        }
        return true;
    }
}
举报

相关推荐

0 条评论