代码随想录day06

一、有效的字母异位词(LeetCode242)

通过哈希表数组的形式将第一个字符串遍历到表中,对出现的字母做计数;然后遍历另一个字符串去表中查询,若有相同字母则计数减一;最后遍历hash数组,如果有的元素不为零0,说明字符串s和t一定是谁多了字符或者谁少了字符;若所有元素都为零0,说明字符串s和t是字母异位词。

/**
 * 字典解法
 * 时间复杂度O(m+n) 空间复杂度O(1)
 */
class Solution {
    public boolean isAnagram(String s, String t) {
        int[] hash = new int[26];
        for(int i = 0;i < s.length();i++){
            hash[s.charAt(i) - 'a']++; //并不需要记住字符a的ASCII,只要求出一个相对数值就可以了
        }
        for(int j = 0;j < t.length();j++){
            hash[t.charAt(j) - 'a']--;
        }
        for(int i = 0;i < 26;i++){
            if(hash[i] != 0){ //hash数组如果有的元素不为零0,说明字符串s和t一定是谁多了字符或者谁少了字符。
                return false;
            }
        }
        return true; //hash数组所有元素都为零0,说明字符串s和t是字母异位词
    }
}

二、两个数组的交集(LeetCode349)

通过hash表set集合的形式把数组1放进去,之后遍历数组2并contains作判断set中是否有相同元素,若有则吧相同的元素存在另一哈希表set1中,最后将结果转化为数组输出。(输出用到了stream流,mapToInt拿到Integer流对象,之后toArray终止流就可以返回int数组)

import java.util.HashSet;
import java.util.Set;

class Solution {
    public int[] intersection(int[] nums1, int[] nums2) {
        if(nums1 == null || nums1.length == 0 || nums2 == null || nums2.length == 0){
            return new int[0];
        }
        Set<Integer> set = new HashSet<>();
        Set<Integer> result = new HashSet<>();
        //把数组1的值放进set中
        for(int num1 : nums1){
            set.add(num1);
        } 
        //遍历数组2并判断set中是否存在相同元素
        for(int num2 : nums2){
            if(set.contains(num2)){
                result.add(num2); 
            }
        }
        //IntStream intStream = result.stream().mapToInt(x -> x);//x->x是lamdam语法不对元素做处理
        //return intStream.toArray();
        return result.stream().mapToInt(x -> x).toArray(); //将结果几何转为数组
        //通过stream()方法拿到流对象,mapToInt拿到Int流对象,就可以toArray返回int数组了
        //如果这里是String泛型要转为int数组的话,就要调用Integer.parseInt()方法,lambda写法:mapToInt(Integer::parseInt)
    }
}

三、快乐数(LeetCode202)

通过哈希表set形式将不等于1和哈希表中不存在的书放入表中,并构造函数求符合条件的数,在函数中要通过%10取余取数的最低位,/10取数的最高位。

class Solution {
    public boolean isHappy(int n) {
       Set<Integer> hash = new HashSet<>();
       while(n != 1 && !hash.contains(n)){
           hash.add(n);
           n = getNextNumber(n);
       } 
       return n == 1;
    }
    private int getNextNumber(int n){
        int sum = 0;
        while(n > 0){
            int tem = n % 10; // 取最低位,例n=19,tem=9
            sum += (int)(Math.pow(tem,2));
            n = n / 10; // 取最高位,例n=19,此时/10后n=1
        }
        return sum;
    }
}

四、两数之和(LeetCode1)

创建一个长度为2的数组存放符合条件的两位数的下标,因为要存放数值和它的下标所以创建一个map形式的哈希表;遍历当前元素,并在map(刚开始时的map是空的)中寻找是否有匹配的key,如果没找到匹配对,就把访问过的元素和下标加入到map中。

class Solution {
    public int[] twoSum(int[] nums, int target) {
        int[] res = new int[2];
        if(nums == null || nums.length == 0){
            return res;
        }
        Map<Integer,Integer> map = new HashMap<>();
        for(int i = 0;i < nums.length;i++){
            int tem = target - nums[i]; // 遍历当前元素,并在map中寻找是否有匹配的key
            if(map.containsKey(tem)){ //此时的map还未存值,所以以下的res数组下标是倒叙的
                res[1] = i;
                res[0] = map.get(tem);
            }
            map.put(nums[i], i);    // 如果没找到匹配对,就把访问过的元素和下标加入到map中
        }
        return res;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值