Easy
221183FavoriteShare
Given a non-empty array of integers, every element appears twice except for one. Find that single one.
Note:
Your algorithm should have a linear runtime complexity. Could you implement it without using extra memory?
Example 1:
Input: [2,2,1] Output: 1
Example 2:
Input: [4,1,2,1,2] Output: 4
Java:
哈希表法:
/*
* @Author: SourDumplings
* @Link: https://github.com/SourDumplings/
* @Email: changzheng300@foxmail.com
* @Description: https://leetcode.com/problems/single-number/
* @Date: 2019-03-31 19:18:33
*/
import java.util.Hashtable;
class Solution
{
public int singleNumber(int[] nums)
{
Hashtable<Integer, Integer> h = new Hashtable<Integer, Integer>();
for (int i : nums)
{
if (h.containsKey(i))
h.put(i, h.get(i) + 1);
else
h.put(i, 1);
}
int ret = 0;
for (int i : nums)
{
if (h.get(i) == 1)
{
ret = i;
break;
}
}
return ret;
}
}
C++:
哈希表法:
/*
* @Author: SourDumplings
* @Link: https://github.com/SourDumplings/
* @Email: changzheng300@foxmail.com
* @Description: https://leetcode.com/problems/single-number/
* @Date: 2019-03-31 19:11:50
*/
class Solution
{
public:
int singleNumber(vector<int> &nums)
{
unordered_map<int, int> map;
int ret;
for (auto &i : nums)
{
++map[i];
}
for (auto &i : nums)
{
if (map[i] == 1)
{
ret = i;
break;
}
}
return ret;
}
};
算术法:
/*
* @Author: SourDumplings
* @Link: https://github.com/SourDumplings/
* @Email: changzheng300@foxmail.com
* @Description: https://leetcode.com/problems/single-number/
* @Date: 2019-03-31 19:11:50
*
* 将所有的数放在集合里,求和再2倍,再减去原序列和即可
*/
class Solution
{
public:
int singleNumber(vector<int> &nums)
{
set<int> s;
for (auto &i : nums)
{
s.insert(i);
}
int temp = accumulate(s.begin(), s.end(), 0) * 2;
return temp - accumulate(nums.begin(), nums.end(), 0);
}
};
位运算法:
/*
* @Author: SourDumplings
* @Link: https://github.com/SourDumplings/
* @Email: changzheng300@foxmail.com
* @Description: https://leetcode.com/problems/single-number/
* @Date: 2019-03-31 19:11:50
*
* a ^ a = 0, a ^ 0 = a, (a ^ a) ^ b = b
* 故我们将所有的数异或起来即可
*/
class Solution
{
public:
int singleNumber(vector<int> &nums)
{
int ret = 0;
for (auto &i : nums)
{
ret ^= i;
}
return ret;
}
};