只出现一次的数字 (leetcode136)
一:解题思路
这道题目介绍2种方法。
解法一:利用位运算来做,数组中所有的数字都是成对出现的,只有一个是单独出现的,那么我们可以利用异或的性质来做。Time:O(n),Space:O(1)
解法二:利用集合set的特性,把所有数字添加到集合中(每个数字只出现一次),然后将集合中的数字乘以2减去原来数组元素和。Time:O(n),Space:O(n)
二:完整代码示例 (C、C++、Java、Python)
方法一C:
int singleNumber(int* nums, int numsSize) { int result = 0; for (int i = 0; i < numsSize; i++) { result ^= nums[i]; } return result; }
方法二C:
方法一C++:
class Solution { public: int singleNumber(vector<int>& nums) { if (nums.size() == 0) return -1; int result = 0; for (int i = 0; i < nums.size(); i++) { result ^= nums[i]; } return result; } };
方法二C++:
class Solution { public: int singleNumber(vector<int>& nums) { if (nums.size() == 0) return -1; set<int> s; int sum1 = 0; int sum2 = 0; for (int num : nums) { if (s.count(num) == 0) { s.insert(num); sum1 += num; } sum2 += num; } return 2 * sum1 - sum2; } };
方法一Java:
class Solution { public int singleNumber(int[] nums) { if(nums.length==0 || nums==null) return -1; int result=0; for(int num:nums){ result^=num; } return result; } }
方法二Java:
class Solution { public int singleNumber(int[] nums) { if(nums.length==0 || nums==null) return -1; Set<Integer> set=new HashSet<>(); int sum1=0; int sum2=0; for(int num:nums){ if(!set.contains(num)){ set.add(num); sum1+=num; } sum2+=num; } return 2*sum1-sum2; } }
方法一Python:
class Solution: def singleNumber(self, nums: List[int]) -> int: length=len(nums) if length==0: return -1 result=0 for i in range(0,length): result^=nums[i] return result
Python写法二:
class Solution:
def singleNumber(self, nums: List[int]) -> int:
if not nums : return None
sum1 = 0
sum2 = 0
s = set()
for i in range(0,len(nums)):
if nums[i] not in s:
s.add(nums[i])
sum1 += nums[i]
sum2 += nums[i]
return 2*sum1 - sum2
方法二Python:
class Solution: def singleNumber(self, nums: List[int]) -> int: length=len(nums) if length==0: return -1 hash_set={} sum1=0 sum2=0 for i in range(0,length): if hash_set.get(nums[i]) is None: hash_set[nums[i]]=i sum1+=nums[i] sum2+=nums[i] return 2*sum1-sum2

浙公网安备 33010602011771号