算法跟学Day6【代码随想录】

【哈希表】

大纲

● 242.有效的字母异位词
● 349. 两个数组的交集
● 202. 快乐数
● 1. 两数之和

leetcode 242 有效的字母异位词

思路

  • 判断两字符串中出现的字符种类和个数是否相同
  • 构造一个数组来统计
  • 遍历维护数组得到结果

细节

  • 题目中给定的字符串内容仅为小写字母 设置数组大小为26 每个字母在数组中的位置根据ASCII码序排列
  • 减去首字母a得到从零开始的下标索引

代码

class Solution {
    public boolean isAnagram(String s, String t) {
        int m = s.length(), n = t.length();
        if (m != n) return false;
        int[] tab = new int[26];
        for (int i = 0; i < m; i++) {
            tab[s.charAt(i) - 'a']++;
            tab[t.charAt(i) - 'a']--;
        }
        for (int num : tab) if (num != 0) return false;
        return true;
    }
}

leetcode 349 两个数组的交集

思路

  • 返回两数组的元素交集 从而想到数据结构set 由此分别求出两数组的元素 再逐个遍历

细节

  • 为减少遍历次数 可先在遍历一个数组放入set 再遍历另一数组判断是否同时在两数组中 省去多写一个循环

代码

class Solution {
    public int[] intersection(int[] nums1, int[] nums2) {
        Set<Integer> set1 = new HashSet<>(), set2 = new HashSet<>();
        for (int i : nums1) set1.add(i);
        for (int i : nums2) if (set1.contains(i)) set2.add(i);
        int[] res = new int[set2.size()];
        int k = 0;
        for (int i : set2) res[k++] = i;
        return res;
    }
}

leetcode 202 快乐数

思路

  • 由于需要求的和为1 可能会出现无限循环 而出现无限循环的时机必然为某次出现的和重复
  • 通过set保存每次求出的和 若出现和已有的sum则停止循环返回false

细节

  • 求某个数的逐位 可通过取模10 相除10来迭代遍历

代码

class Solution {
    public boolean isHappy(int n) {
        Set<Integer> set = new HashSet<>();
        int sum = 0;
        while (true) {
            sum = getSum(n);
            if (sum == 1) return true; 
            if (set.contains(sum)) return false;
            else set.add(sum);
            n = sum;
        }
    }

    public int getSum(int n) {
        int sum = 0;
        while (n != 0) {
            sum += (n % 10) * (n % 10);
            n /= 10;
        }
        return sum;
    }
}

leetcode 1 两数之和

思路

  • 暴力求解空间最优 但是时间太久 采用空间换时间的方法
  • 保存下已遍历的数 随时查看当前与之前数中是否有满足两数之和的例子

细节

  • 注意使用的额外空间是map 因为需要同时记录数组的值和索引

代码

class Solution {
    public int[] twoSum(int[] nums, int target) {
        Map<Integer, Integer> map = new HashMap<>();
        for (int i = 0; i < nums.length; i++)
            if (map.containsKey(target - nums[i]))
                return new int[]{map.get(target - nums[i]), i};
            else map.put(nums[i], i);
        return new int[2];
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值