代码随想录 day6 有效的字母异位词,两个数组的交集,快乐数,两数之和

61 阅读1分钟

1.有效的字母异位词

力扣题目链接

public boolean isAnagram(String s, String t) {
    //创建一个数组用于记录不同的字母出现的次数
    int[] ints = new int[26];
    
    //如果s中出现一个字母,那么相应的单词下标就加一
    for (int i = 0; i < s.length(); i++) {
        ints[s.charAt(i) - 'a']++;
    }
    
    //如果t中出现一个字母,那么相应的单词下标就减一
    for (int i = 0; i < t.length(); i++) {
        ints[t.charAt(i) - 'a']--;
    }
    
    //若最后的数组每个位置都是0,那么返回true,否则返回false
    for (int anInt : ints) {
        if (anInt != 0) {
            return false;
        }
    }
    return true;
}

心得体会:

1.数组就是一张哈希表。哈希表中关键码就是数组的索引下标,然后通过下标直接访问数组中的元素。

2.一般哈希表都是用来快速判断一个元素是否出现集合里。当我们遇到了要快速判断一个元素是否出现集合里的时候,就要考虑哈希法

2.两个数组的交集

力扣题目链接

//两个数组中,任意一个数组为null,或者length为0,都说明没有交集,返回空数组
if (nums1 == null || nums1.length == 0 || nums2 == null || nums2.length == 0) {
    return new int[0];
}
HashSet<Integer> hashSet = new HashSet<>();
HashSet<Integer> res = new HashSet<>();

//将nums1中的数放入hashset中
for (int i = 0; i < nums1.length; i++) {
    hashSet.add(nums1[i]);
}

for (int i = 0; i < nums2.length; i++) {
    //如何有重复的部分,则将这个数字放入res中
    if (hashSet.contains(nums2[i])) {
        res.add(nums2[i]);
    }
}

int[] ints = new int[res.size()];
int i = 0;
for (int re : res) {
    ints[i++] = re;
}
return ints;

心得体会:

这道题用HashSet很方便,可以自动去重

image.png

3. 快乐数

力扣题目链接

public boolean isHappy(int n) {
    //建立一个hashset用于记录出现过的数字
    Set<Integer> record = new HashSet<>();
    //得到一个数各个位置上平方之后的和
    n = getNextNumber(n);
    //当n不为1且record没有出现重复的数时进行循环
    while (n != 1 && !record.contains(n)) {
        //将结果记录下来
        record.add(n);
        n = getNextNumber(n);
    }
    return 1 == n;
}

private int getNextNumber(int n) {
    int res = 0;
    while (n != 0) {
        //得到末尾的数
        int num = n % 10;
        res += num * num;
        //整数相除的结果也为整数
        n = n / 10;
    }
    return res;
}

4. 两数之和

力扣题目链接

//key为对应索引的值,value为数组下标索引
HashMap<Integer, Integer> record = new HashMap<>();
int[] res = new int[2];
if (nums == null || nums.length == 0) {
    return res;
}
for (int i = 0; i < nums.length; i++) {
    int temp = target - nums[i];
    //查看已经遍历过的值中有无符合条件的
    if (record.containsKey(temp)) {
        res[0] = i;
        res[1] = record.get(temp);
        break;
    }
    record.put(nums[i], i);
}
return res;