leetcode刷题day6|哈希表部分( 242.有效的字母异位词 、349. 两个数组的交集 、202. 快乐数 、 1. 两数之和)

前言:哈希表系列的题目是第一次做,但是大概了解过哈希表,不是很难,写起来应该会比较轻松,但是因为没接触过,所以会先看一遍答案,熟悉解题思路后再自己去写。

242.有效的字母异位词

题目链接:https://leetcode.cn/problems/valid-anagram/description/
解题思路:建立一个包含26个字母的数组,因为26个小写字母的ASCII是连续的,所以可以直接用数组的index指代26个字母,数组中的值记录某一个字母出现的次数。
先遍历字符串s,对应的字母加1;再遍历t,对应的字母减1。如果最后数组中所有元素均为0,则true,否则两个字符串并非同一组字母异位组成。

代码如下:

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

注意:数组的长度是属性可以直接使用nums.length;字符串的长度是方法,需要使用s.length()。
学到的新方法:

  • 获取字符串的字符使用s.charAt()方法;
  • 增强型 for 循环:只读遍历数组或集合的每个元素。其中,type 是要遍历的元素的类型;element 是临时变量,代表每次迭代中当前的元素;collection 是要遍历的数组或集合。
for (type element : collection) {
    // 循环体
}

349. 两个数组的交集

题目链接:https://leetcode.cn/problems/intersection-of-two-arrays/description/
思路:该题数字大小的范围并不确定,可能会很大,所以不适合使用数组,选取set来实现。HashSet 是 Java 集合框架中的一种数据结构,它是 Set 接口的一个实现类,底层使用哈希表来存储元素,提供了常数时间复杂度的操作。HashSet 的特点是不允许存储重复的元素,并且不保证元素的插入顺序,即它们不是按照插入顺序存储的。较好的符合题目的要求。
常用方法如下:

  • add(E e): 添加元素 e 到此集合中,如果该集合不包含该元素,则返回 true
  • contains(Object o):如果此集合包含指定的元素,则返回 true
  • remove(Object o): 移除指定的元素,如果该元素存在于集合中,则返回true。
  • size(): 返回集合中的元素数量。
  • isEmpty(): 如果集合不包含任何元素,则返回 true。
  • clear():移除集合中的所有元素。
  • addAll(Collection<? extends E> c): 将指定集合中的所有元素添加到此集合中。
  • removeAll(Collection<?> c): 移除此集合中包含的所有指定集合中的元素。
  • retainAll(Collection<?> c): 只保留此集合与指定集合共有的元素。
  • iterator():返回一个迭代器,可以用来遍历集合中的元素。

代码如下:

import java.util.HashSet;
class Solution {
    public int[] intersection(int[] nums1, int[] nums2) {
        HashSet<Integer> set1 =new HashSet<>();
        HashSet<Integer> sameSet=new HashSet<>(); 
        for(int num1 :nums1){
            set1.add(num1);
        }
        for(int num2:nums2){
            if(set1.contains(num2)){
                sameSet.add(num2);
            }
        }
        //新建一个数组存放交集元素
        int[] nums=new int[sameSet.size()];
        int j=0;
        for(int count: sameSet){
            nums[j++]=count;
        }
        return nums;
    }
}

202. 快乐数

题目链接:https://leetcode.cn/problems/happy-number/description/
思路:这个题对我来说有两个难点,一个是如何取到数字每个位数上的值;另一个是如何判定该数值不是快乐数。
针对第一个难点:通过除10取余来得到数字。
第二个难点:题目的一个关键是如果不是快乐数,得到的结果sum会出现无限循环,也就是说当sum出现了重复值时,意味着该数字不是快乐数。因此可以设置一个HashSet来保存sum值。
代码如下:

class Solution {
    public boolean isHappy(int n) {
        Set<Integer> records=new HashSet<>();
        while(n!=1 && !records.contains(n)){
            records.add(n);
            n=sumCount(n);
        }
        return n==1;
    }
    private int sumCount(int n){
        int result=0;
        while(n!=0){
            result+=(n%10)*(n%10);
            n=n/10;
        }
        return result;
    }
}

1. 两数之和

题目链接:https://leetcode.cn/problems/two-sum/description/
思路:改题需要同时记录值和下标,所以选用HashMap来解决。
HashMap 是 Java 集合框架中的一个核心类,它实现了 Map 接口,用于存储键值对(key-value pairs)。HashMap 使用哈希表来存储数据,提供了高效的插入、删除和查找操作。
常用方法:

  • put(key, value):将指定的键值对插入到 HashMap 中。如果键已经存在,则更新该键对应的值。
  • get(key):返回指定键对应的值。如果键不存在,则返回 null。
  • remove(key):移除指定键及其对应的值。
  • containsKey(key):检查 HashMap 是否包含指定的键。
  • containsValue(value):检查 HashMap 是否包含指定的值。
  • isEmpty():检查 HashMap 是否为空。
  • size():返回 HashMap 中键值对的数量。
  • clear():清空 HashMap。

代码如下:

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值