java 只出现一次的数字

本文探讨了在数组中查找唯一出现一次的元素的有效算法。介绍了两种主要方法:使用哈希表进行快速查找,以及利用异或运算的数学特性解决相同问题。这两种方法均能高效地从大量重复数据中定位到目标元素。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目:

给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。

解题思路:
/*
1.定义一个count进行计数
2.遍历:
    创建两个指针进行遍历
    在其中一个指针遍历结束后,对count进行判断
        若为1,则是要查找的数字
        若不为1,进行下一轮遍历,count清零
 */
代码实现:
//只出现一次的数字
import java.util.Scanner;
class a136{
    public static void main(String[] agrs){
        //提示用户输入想要进行查找的几个数字
        Scanner scanner=new Scanner(System.in);
        System.out.print("输入想要查找数字的长度:");
        int[] a=new int[scanner.nextInt()];
        //给数组赋值元素
        System.out.print("请输入想要查找的数字:");
        for(int i=0;i<a.length;i++){
            a[i]=scanner.nextInt();
        }
        //定义一个查找函数
        int w=project(a);
        if(w==-1){
            System.out.println("该数字不存在");
        }else{
            System.out.println(a[w]);
        }
    }
    public static int project(int[] a){
        //遍历进行查找
        int count=0;
        for(int i=0;i<a.length;i++){
            for(int j=0;j<a.length;j++){
                if(a[i]==a[j]){
                    count++;
                }
            }
            if(count==1){
                return i;
            }
            count=0;
        }
        return -1;
    }
}
核心算法
 public static int project(int[] a){
        //遍历进行查找
        int count=0;
        for(int i=0;i<a.length;i++){
            for(int j=0;j<a.length;j++){
                if(a[i]==a[j]){
                    count++;
                }
            }
            if(count==1){
                return i;
            }
            count=0;
        }
        return -1;
    }

利用两个指针依次进行遍历,最终找出只出现一次的
但该代码耗时较长,不推荐

其他方法
1. 哈希表

哈希的性质:其是不包含任何重复元素的无序集合。
【利用其性质进行使用哈希方法】
因为每个重复元素最多存在两个,而重复元素的第一个添加后均被移除,而第二个均未添加成功,故此时哈希集只保留唯一且未重复的元素

时间复杂度:O(n)
空间复杂度:O(n)

 public int singleNumber(int[] nums) {
 		//定义一个哈希表
        Map<Integer, Integer> map = new HashMap<>();
        //依次遍历,进行查找
        for (Integer i : nums) {
        	//获取一个count指标,将其他数与其比较
            Integer count = map.get(i);
            count = count == null ? 1 : ++count;
            map.put(i, count);
        }
        for (Integer i : map.keySet()) {
            Integer count = map.get(i);
            if (count == 1) {
                return i;
            }
        }
        return -1; // can't find it.
    }
2. 异或

规则:

  1. 交换律:a ^ b ^ c <=> a ^ c ^ b
  2. 任何数于0异或为任何数 0 ^ n => n
  3. 相同的数异或为0: n ^ n => 0
    【利用题目中的“其余每个元素均出现两次”,来使用异或方法】
int ans = nums[0];
if (nums.length > 1) {
   for (int i = 1; i < nums.length; i++) {
      ans = ans ^ nums[i];
   }
 }
 return ans;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值