leetcode 137. Single Number II

来源:互联网 发布:黑客攻击软件 编辑:程序博客网 时间:2024/06/05 23:57

Given an 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?

也许有着更好地位运算的做法,但是我肯定是想不到了。在这里我是用HashMap来做,效果应该不错。

建议和这一道题leetcode 260. Single Number III 位操作 和 leetcode 136. Single Number 位操作

代码如下:

import java.util.Arrays;import java.util.HashMap;import java.util.Iterator;import java.util.Map;/* * 使用Hash来做,要比使用Sort做快一点 * */public class Solution{    public int singleNumber(int[] nums)     {        if(nums==null || nums.length<=0)            return 0;        Map<Integer, Integer> map=new HashMap<Integer, Integer>();        for(int i=0;i<nums.length;i++)            map.put(nums[i], map.getOrDefault(nums[i], 0)+1);        Iterator<Integer> iter=map.keySet().iterator();        while(iter.hasNext())        {            int key=iter.next();            if(map.get(key)!=3)                return key;        }        return 0;    }    /*     * 这是用排序做得     * */    public int singleNumberBySort(int[] nums)     {        if(nums==null || nums.length<=0)            return 0;        Arrays.sort(nums);        int number = 0;        boolean flag = true;        for(int i = 0 ; i<nums.length-2 ; i++)        {            if(nums[i] == nums[i+1] && nums[i+1] == nums[i+2])                i+=2;            else            {                if(nums[i]==nums[i+1])                    number = i + 2;                else                    number = i;                flag=false;                break;            }        }        if(flag)            number = nums.length-1;        return nums[number];    }}

下面是C++的做法,本体应该可以通过运算来实现的,但是我更喜欢使用排序或者map计数来实现

代码如下:

#include <iostream>#include <vector>#include <algorithm>#include <string>#include <map>#include <climits>using namespace std;class Solution {public:    int singleNumber(vector<int>& nums)    {        map<int, int> mmp;        for (int key : nums)        {            if (mmp.find(key) == mmp.end())                mmp[key] = 1;            else                mmp[key] += 1;        }        for (map<int, int>::iterator i = mmp.begin(); i != mmp.end(); i++)        {            if (i->second == 1)                return i->first;        }        return 0;    }};
原创粉丝点击