java实现找出数组中只出现一次的元素

找出数组中出现一次的元素

第一种方式,双层for循环遍历数组

	把每个元素都与数组中的其他元素对比,若没有相同的元素,则此元素只出现一次。代码如下:
	public static void getSinglition(){

        int[] arrey = new int[]{1,2,3,4,5,3,2,1};

        for (int i = 0; i < arrey.length; i++) {

            boolean flag = true;

            for (int j = 0; j < arrey.length; j++) {

                if (arrey[i] == arrey[j] && i != j){   // 排除自身相同的情况
                    flag = false;   // 如何除本身外存在相等的元素,则把flag设为flase
                    continue;
                }
            }

            // 如果循环一次后,flag没有改变,说明此元素为单个元素
            if (flag){
                System.out.println(arrey[i]);
            }
        }
    }
优点:可以找出多个出现一次的元素
缺点:时间复杂度高

第二种方式,异或

	使用异或的方式有一个前提,只有一个数出现了一次,其他数都是成对出现。
	利用异或的特性,用0异或数组中的每一个元素,最后结果就是我们要找的那个只出现一次的元素。异或的特性如下:
1.  0异或一个数等于它本身

验证1
2. 一个数异或它自己等于0,即同一个数异或0两次等于0
验证2
使用异或方式代码如下:

public void getSinglition(){

        int result = 0;
        int[] arrey = new int[]{1,2,3,4,3,2,1};
        for (int i = 0; i < arrey.length; i++) {
            result = result ^ arrey[i];
        }
        System.out.println(result);
    }

优点:时间复杂度小
缺点:只适用数组只存在一个出现一次元素的情况。如果数组中有多个出现一次的元素,则无法找到出现一次的元素。

第三种方式,先对数组排序,如果一个元素和它前一位或后一位的元素都不相等,则此元素在数组中只出现一次。

需要注意数组下标越界。
public void getSinglition(){

        int[] arrey = new int[]{1,2,3,4,5,6,3,3,2,1,5};
        int len = arrey.length;
        Arrays.sort(arrey);   // 对数组进行排序
        
        for (int i = 0; i < len; i++) {

            if (i ==0){
                if (arrey[0] != arrey[1]){
                    System.out.println(arrey[0]);
                }
            }

            if (i > 0 && i < len - 1){

                if (arrey[i-1] != arrey[i] && arrey[i] != arrey[i+1]){
                    System.out.println(arrey[i]);
                }
            }

            if (i == len - 1){
                if (arrey[i - 2] != arrey[i])
                    System.out.println(arrey[len - 1]);
            }
        }
    }

优点:可以找出数组中多个出现一次的元素
缺点:数组排序,需要消耗额外的时间和空间

  • 1
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值