string 找出所有数字 index_【经典算法】找出数组只出现一次的数字

本文介绍两种方法来找出数组中仅出现一次的数字:一种是利用Map集合统计各元素出现次数并查找;另一种是采用异或运算高效解决问题。推荐使用异或解法。

4c35ac659bef6603ad4e02ed3b85e0f4.gif

找出数组只出现一次的数字

题目

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

示例:

输入: [-1,-5,3,1,-5]输出: 3

思路1:map集合解法

       用map集合来处理,把数组的元素作为key,然后出现的次数为value,遍历数组,然后再遍历整个map集合,找出value为1的关键字。

代码:

public class singleNumber {
    public static void main(String[] args) {
        int[] data = new int[]{1, -5, 3, 1, -5};
        System.out.println(singleNumber(data));
    }


    /**
     * map集合解法
     * 把数组的元素作为key,然后出现的次数为value,遍历数组,然后再遍历整个map集合,找出value为1的关键字
     * @param nums
     * @return
     */
    public static int mapSolution(int[] nums) {
        int num = 0;
        Map map = new HashMap();//遍历该数组,往map集合里存,数组元素为key,出现次数为valuefor(int i = 0;i            if (map.get(nums[i]) == null) {
                map.put(nums[i], 1);
            } else if (map.get(nums[i]) == 1) {
                map.put(nums[i], 2);
            }
        }//找出map集合里value为1的元素for (Map.Entry str : map.entrySet()) {if (str.getValue() == 1) {
                num = str.getKey();
            }
        }return num;
    }
}

思路2:异或解法(推荐使用)

       因为数组中除了一个元素只出现一次之外,其它的元素都出现两次,如果把所有的数都异或,相同的数字异或为0,最后只剩下出现一次的数字,它和0异或,结果就是它本身。

扩展:

异或运算是位操作,需要将数转为二进制的原码,然后转为补码,将两数的补码按位进行异或,最后再转为原码即可。

代码:

public class singleNumber {
    public static void main(String[] args) {
        int[] data = new int[]{1, -5, 3, 1, -5};
        System.out.println(singleNumber(data));
    }

    /**
     * 异或解法(推荐使用)
     * 把所有的数都异或,相同的数字异或为0,最后只剩下出现一次的数字,它和0异或,结果就是它本身
     * @param nums
     * @return
     */
    public static int singleNumber(int[] nums) {
        int num = 0;
        for (int i : nums) {
            num ^= i;
        }
        return num;
    }
}

71da334de77e1d871c805cb7a54e9f38.gif

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值