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;
}
};