LeetCode——Single Number
# 136
Given an 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?
这一题的目的是要找出一个整型数组中,没有出现两次的那个元素。有额外的要求,算法必须有线性的时间复杂度。需要在不是用额外的内存的条件下,解决这个问题。
在这个条件下,使用两个循环来找到只出现一个的元素,时间复杂度为O(n²)。这样是无法通过LeetCode。但也写了一下,就当加深对count函数的记忆。
- C++
class Solution {
public:
int singleNumber(vector<int>& nums) {
for(int i = 0;i < nums.size();i++)
{
if(count(nums.begin(),nums.end(),nums[i]) < 2)
return nums[i];
}
}
};
也可以现对数组进行排序,然后比较前后两个元素,如果不同,则返回前一个元素。
- Python
class Solution:
def singleNumber(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
nums.sort()
for i in range(1,len(nums),2):
if nums[i] != nums[i-1]:
return nums[i-1]
return nums[-1]
- Java
public class Solution {
public int singleNumber(int[] nums) {
Arrays.sort(nums);
for(int i = 1;i < nums.length;i += 2)
{
if(nums[i] != nums[i - 1])
return nums[i - 1];
}
return nums[nums.length - 1];
}
}
看到一种解法,是运用了异或的可交换的性质,非常的巧妙。
- C++
class Solution{
public:
int singleNumber(vector<int>& nums){
int res = 0;
for(int i = 0;i < nums.size();i++)
{
res ^= nums[i];
}
return res;
}
};
这一题主要考察的是时间优化吧,对于数组的优化,往往一个排序会起到很好的作用。再就是异或运算的一个可交换性。