只出现一次的数字
一、题目描述
一、English版本
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
二、中文版
给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
说明:
你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?
示例 1:
输入: [2,2,1] 输出: 1
示例 2:
输入: [4,1,2,1,2] 输出: 4
二、ruby方案
动态语言和静态语言不同,有很多现有的方法,并不一定非要照着静态的思路或者算法, 相反如果在没有约束的条件下,解决问题才是王道,使用灵活使用动态语言封装的方法是应该首先想到的。
# @param {Integer[]} nums
# @return {Integer}
def single_number(nums)
if nums.empty?
rerurn nil
end
i = 0
while i < nums.size do
if nums.count(nums[i]) == 1
return nums[i]
end
i += 1
end
nil
end
三、python方案
同上
class Solution(object):
def singleNumber(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
for i in nums:
if nums.count(i) == 1:
return i
return None
四、java方案
方案一:借助辅助空间
set或者hash,但是题目要求不要使用辅助空间。
import java.util.Set;
import java.util.HashSet;
import java.lang.Integer;
class Solution {
public int singleNumber(int[] nums) {
if (nums.length == 0) {
return 0;
}
Set<Integer> set = new HashSet<>();
for (int i = 0; i < nums.length; i++) {
if (set.contains(nums[i])) {
set.remove(nums[i]);
} else {
set.add(nums[i]);
}
}
return (int)set.toArray()[0];
}
}
五、经典解法,算法思想
异或: pry(main)> 2 ^ 1 ^ 2 ^ 3 ^ 1 # 3
# @param {Integer[]} nums
# @return {Integer}
def single_number(nums)
if nums.empty?
rerurn nil
end
# 两种方式等价,因为0^0 = 0; 0^m = m
#res = 0
#nums.each do |num|
# res ^= num
#end
res = nums[0]
nums[1..-1].to_a.each do |num|
res ^= num
end
res
end
Show Disqus Comments