一题多写(1),打牢基础(哈希set相关用法)

本章是哈希相关的知识,题目用哈希相关知识来解 ,相关知识:java集合通用方法-优快云博客

136. 只出现一次的数字

注意点一:

        利用set集合的不重复性,如果多次存入“同一个数”(即被判定为重复的元素),只有第一个元素会被保留,后续重复的添加操作会被自动忽略这是 Set 的核心特性:不允许重复元素

        利用Set 的去重特性,可以高效解决需要唯一性约束的问题(如统计不重复元素的数量)。

同样,当集合中已存在元素A,那么再次进行添加元素A时,map.add(nums[i])会返回false,重复元素会返回 false,但被自动忽略,但可以用此作为判断条件。

  1. 当元素首次出现时

    • se.add(nums[i]) 返回 true(添加成功),此时 !true 为 false,不执行 remove
    • 元素被保留在集合中
  2. 当元素重复出现时

    • se.add(nums[i]) 返回 false(添加失败),此时 !false 为 true,执行 remove
    • 元素被从集合中移除

        就是说:没有重复元素,se.add(nums[i])每次都执行添加操作,但只有在没有重复元素的时候才能添加,有重复元素时,添加但添加不成功同时只有第一个元素会被保留,后续重复的添加操作会被自动忽略再通过返回的true和false,进行判断是否执行remove删除操作,set集合的元素不重复性,删除set集合中保留的一个不重复元素。

        因此:此代码会删除出现偶数次的元素至无,保留出现奇数次的元素。

Set<Integer>se=new HashSet<>();
	       for(int i=0;i<nums.length;i++){
		        if(!se.add(nums[i])){// 尝试添加元素,并根据结果判断是否执行移除
		            se.remove(nums[i]);
		        }
	       }

注意点二:

        public int singleNumber(int[] nums) {要返回int型数据,在集合中的元素要拿出来,set集合中的元素是无序的,Set没有像List那样的get(int index)方法

        法一:

将set集合转换乘数组,这个数组不是有序的,用   集合.toArray();方法;

toArray() 默认返回 Object[]无法直接指定泛型类型。

        Integer[]  num  =  new   Integer[objArray.length];

创建一个长度为 objArray.length 的 Integer 类型空数组 num,用于存储转换后的结果

num[i]=(Integer) objArray[i];要注意数据类型转换。

转换为Integer 类型,但方法返回 int,Java 会自动拆箱为基本类型。

class Solution {
    public int singleNumber(int[] nums) {
       Set<Integer>se=new HashSet<>();
	       for(int i=0;i<nums.length;i++){
		        if(!se.add(nums[i])){// 尝试添加元素,并根据结果判断是否执行移除
		            se.remove(nums[i]);
		        }
	       }
	       Object[] objArray = se.toArray(); 
	       Integer[]num=new Integer[objArray.length];
	       for(int i=0;i<objArray.length;i++) {
	    	   num[i]=(Integer) objArray[i];//转换为Integer 类型,但方法返回 int,Java 会自动拆箱为基本类型。
	       }
	       return num[0];
    }
}

        法二:使用迭代器

迭代器(Iterator)的作用
  • 迭代器是 Java 中用于遍历集合(如 SetList)元素的工具。
  • set.iterator() 会返回一个迭代器对象,指向集合的起始位置。
 next() 方法的作用
  • next() 方法返回迭代器指向的当前元素,并将迭代器移动到下一个位置。
  • 在本题中,由于集合中只剩下一个元素,调用 next() 会直接返回这个元素。

因为只用一个元素,所以直接返回这个元素。

    public int singleNumber(int[] nums) {
        Set<Integer> set = new HashSet<>();
        for (int i : nums) {
            if (!set.add(i)) {
                set.remove(i);
            }
        }
        return set.iterator().next();
    }

总结:

        set结合无序,不重复,使用set.add()或set.remove()返回true或false,set中添加重复元素时,如果已有相同元素,已有的元素不变,后续添加元素不会成功,可以将集合转换成数组,默认是Object,可以进行类型转换,不需要再转化成int型,Java有自动拆箱功能,迭代器可以获取迭其中的下一个元素。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值