Java教程

算法学习小结-只出现一次的数字

本文主要是介绍算法学习小结-只出现一次的数字,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

描述

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

样例1

输入: [2,2,1]
输出: 1

样例2

输入: [4,1,2,1,2]
输出: 4

说明

你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?

分析

方案一:双重循环遍历(暴力解法)

class Solution {
    public int singleNumber(int[] nums) {
        for(int i=0;i<nums.length;i++){
            int flag=0;
            for(int j=0;j<nums.length;j++){
                if(nums[i]==nums[j]){
                    flag++;
                }
            }
            if(flag==1)return nums[i];
        }
        return 0;
    }
}

方案二:排序遍历找不同

class Solution {
    public int singleNumber(int[] nums) {
        Arrays.sort(nums);
        if(nums.length<2)
            return nums[0];
        if(nums[0]!=nums[1])
            return nums[0];
        else if(nums[nums.length-1]!=nums[nums.length-2])
            return nums[nums.length-1];
        for(int i=1;i<nums.length-1;i++){
            if(nums[i]!=nums[i-1]&&nums[i]!=nums[i+1]){
                return nums[i];
            }
        }
        return 0;
    }
}

方案三:异或(长知识了,还能这样)
简述:异或运算的特征:
任何数与0异或都是其本身
任何数与自己做异或都是0
异或运算满足交换律:a ⊕ b ⊕ a = b ⊕ a ⊕ a = b ⊕ (a ⊕ a)= b ⊕ 0 = b

class Solution {
    public int singleNumber(int[] nums) {
        int res=0;
        for(int num:nums){
            res ^= num;
        }
        return res;
    }
}

方案四:哈希表

class Solution {
    public int singleNumber(int[] nums) {
        Map<Integer,Integer> map=new HashMap();
        for(Integer i:nums){
            Integer count=map.get(i);
            count = count == null ? 1 : ++count;
            map.put(i,count);
        }
        for(Integer i:map.keySet()){
            if(map.get(i)==1)
            return i;
        }
        return 0;
    }
}
这篇关于算法学习小结-只出现一次的数字的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!