java 在一个给定数组中找出只出现一次的数字,其他数字均出现两次

目标结果为4,只有4出现了一次,其他均为两次

public class TestDemo{
    public static void main(String[] args) {
        int []array={1,2,5,9,8,7,4,1,2,5,9,8,7};
        int num=searchNumber(array);
        System.out.println(num);
    }
    public  static  int  searchNumber(int []array){
        int j=0;
        int i=0;
        for ( i=0;i<array.length;i++){
            int count=0;//每次i的遍历将count赋值为0,进行判断
            for (j=0;j<array.length;j++) {//进行两次for循环把a[i]和去掉下标为i的a[j]进行比较
                if ( i==j)//挖去i==j这一个元素 防止出现每次循环都能找到一个与其相等的值
                    continue;//跳出本次循环继续下一次循环
                if (array[i] == array[j]){
                count++;
                    break;//如果找到了相等的元素,则不是要求的数字,跳出该层循环
                }
            }
            if(count==0)//如果遍历完后count仍然为则为要求的数字
                return array[i];
        }
return 0;
    }
}

输出结果为:4
在这里插入图片描述还有另一种方法用到了位运算,也做一下介绍,位运算代码更加简洁,但是需要用到^异或操作符。

    public  static  int  searchNumber(int []array) {
    int i=0;
    int sum=0;
    while (i<array.length){
        sum=sum^array[i];//这里用到了结合率,相当于从第一个元素一直异或到最后一个元素,结合律:a ^ b ^ c = a ^ (b ^ c) = (a ^ b) ^ c    另外a^a=0,0^n=n
        i++;
    }
    return sum;
    }

在这里插入图片描述可以看到这里的结果也是4,位操作符比较简单,但是需要对位运算比较熟悉。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值