美文网首页
Leetcode 137 - Single Number II

Leetcode 137 - Single Number II

作者: BlueSkyBlue | 来源:发表于2018-07-23 07:24 被阅读108次

题目:

Given a non-empty array of integers, every element appears three times except for one, which appears exactly once. Find that single one.

Note:

Your algorithm should have a linear runtime complexity. Could you implement it without using extra memory?

Example1:

Input: [2,2,3,2]
Output: 3

Example2:

Input: [0,1,0,1,0,1,99]
Output: 99


思路1:

此题最简单粗暴的方法当然是使用HashMap了。记录下数组中每个数字出现的次数,最后返回出现次数为1的数字。


代码:

public int singleNumber(int[] nums) {
        Map<Integer, Integer>map = new HashMap<Integer, Integer>();
        for(int i=0;i<nums.length;i++){
            if(map.containsKey(nums[i])){
                int num = map.get(nums[i]) + 1;
                map.put(nums[i], num);
            }else{
                map.put(nums[i], 1);
            }
        }
        int result = 0;
        Iterator<Integer>ite = map.keySet().iterator();
        while(ite.hasNext()){
            int num = ite.next();
            if(map.get(num) == 1){
                result = num;
                break;
            }
        }
        return result;
}

思路2:

本题还有一问,要求在不使用任何额外空间的情况下跑出此题。若想这样解决问题唯有使用位运算了。此题有一点特殊性。除了出现次数为1的数字,其余数字出现的次数都为三次。因此这样的二进制表示的数字在同一位置上1出现的次数余三必为零。不为零的位置则是出现次数为一次的数字的位置。这个时候应该设定一个新的变量result,初始值设为零与该位进行相或操作。遍历完数组后返回这个result


代码:

public int singleNumber2(int[] nums){
        int result = 0;
        for(int i=0;i<32;i++){
            int bit = 1;
            bit <<= i;
            int count = 0;
            for(int j=0;j<nums.length;j++){
                if((bit&nums[j]) != 0){
                    count++;
                }
            }
            if(count %3 != 0){
                result |= bit;
            }
        }
        return result;
}

相关文章

网友评论

      本文标题:Leetcode 137 - Single Number II

      本文链接:https://www.haomeiwen.com/subject/cdkdmftx.html