在牛客网看到的,一位网友统计的各大厂的工作时间,我印象中像华为,拼多多应该是加班时间比较多的。
不过从统计的数据来看,虽然没有登顶第一,但也算是比较靠前。
--------------下面是今天的算法题--------------
来看下今天的算法题,这题是LeetCode的第260题:只出现一次的数字 III。
问题描述
来源:LeetCode第260题
难度:中等
给你一个整数数组 nums,其中恰好有两个元素只出现一次,其余所有元素均出现两次。找出只出现一次的那两个元素。你可以按 任意顺序返回答案。
你必须设计并实现线性时间复杂度的算法且仅使用常量额外空间来解决此问题。
示例1:
输入 :nums = [1,2,1,3,2,5]
输出 :[3,5]
解释 :[5, 3] 也是有效的答案。
示例2:
输入 :nums = [-1,0]
输出 :[-1,0]
2 <= nums.length <= 3 * 10^4
-2^31 <= nums[i] <= 2^31 - 1
除两个只出现一次的整数外,nums 中的其他数字都出现两次
问题分析
这题说的是只有两个数字出现一次,其他数字都出现两次,我们把所有数字都异或一遍, 这样 出现两次的异或结果 都变成了 0 。
假如这两个只出现一次的数字分别是 a 和 b ,结果就变成了 a^b ,因为 a 和 b 是不同的数字,所以这个结果肯定不为 0 ,也就是说这个结果的二进制中肯定有 1 ,我们可以根据这个 1 可以把 a 和 b 分到两个不同的数组中。
然后在使用前面讲的 ,可以求出 a 和 b 。
JAVA:
publicint[] singleNumber(int[] nums) {
int xor = 0;// 保存所有元素异或的结果
for (int num : nums) // 全部都异或一遍
xor ^= num;
xor &= -xor;// 保留xor二进制中最右边的 1
int[] res = {0, 0};
for (int num : nums) {
// 把数组分为两组,每组在分别异或。
if ((num & xor) == 0) {
res[0] ^= num;
} else {
res[1] ^= num;
}
}
return res;
}
C++:
public:
vector<int> singleNumber(vector<int> &nums){
unsignedint xorRes = 0;// 保存所有元素异或的结果
for (auto num: nums) // 全部都异或一遍
xorRes ^= num;
xorRes &= -xorRes;// 保留xor二进制中最右边的 1
vector<int> res(2);
for (auto num: nums) {
// 把数组分为两组,每组在分别异或。
if ((num & xorRes) == 0) {
res[0] ^= num;
} else {
res[1] ^= num;
}
}
return res;
}
Python:
defsingleNumber(self, nums: List[int]) -> List[int]:
xor = 0# 保存所有元素异或的结果
for num in nums: # 全部都异或一遍
xor ^= num
xor &= -xor # 保留xor二进制中最右边的 1
ans1, ans2 = 0, 0
for num in nums:
# 把数组分为两组,每组在分别异或。
if (num & xor) == 0:
ans1 ^= num
else:
ans2 ^= num
return [ans1, ans2]