刷 leetcode 时,遇到如下问题,使用 C++ 我之前认为如下两种写法应该是等价的,但实际上不是: 方法 1:
for(int i = 0;i < nums.size();i++)
{
sum += ((nums[i] >> i)&1);
}
方法二:
for(auto num:nums)
{
sum += ((num >> i)&1);
}
方法二符合预期,也能正确 AC,我开始写的是方法 1 (三刷之前收藏的 200 题),始终不能 AC,看了答案写成方法二就 ok 了,这到底是因为啥?运算符优先级?我加括号括起来还是不对. 完整代码:
class Solution {
public:
int singleNumber(vector<int>& nums) {
int size = nums.size();
int ans = 0;
for(int i = 0;i < 32;i++)
{
int sum = 0;
for(auto num:nums)
{
sum += ((num >> i)&1);
}
if(sum % 3)
ans |= (1 << i);
}
return ans;
}
};
1
Yvette 2021-06-04 01:03:18 +08:00
不等价,你的位运算里用的 i 不是同一个 i
|
2
junksheng 2021-06-04 01:05:10 +08:00 via Android 1
你的 i ?
|
3
jinliming2 2021-06-04 01:14:39 +08:00
方法二里的 i 是哪来的?
|
4
beidounanxizi 2021-06-04 01:37:07 +08:00
这道题 是 真值表的变形 数字电子逻辑设计 据说?
放弃吧 最佳复杂度是 O(N) 还有算比较好理解的 但是复杂度就高了 N² |
5
Xs0ul 2021-06-04 02:01:02 +08:00 1
@beidounanxizi #4 从抽象代数的角度来说,真值表版本用的异或是有限域 F_2 上的加法(可以理解为相加以后再对 2 取余数)。这题只要变成 F_3 上的加法就可以了,也就是相加对 3 取余
|
6
Edcwsyh 2021-06-04 09:08:45 +08:00
为什么嵌套循环里还要用 'i'.....
|
7
yehoshua 2021-06-04 09:36:06 +08:00 via Android
你嵌套两个 i 就有奇怪,这应该是比较低级错误了属于基础方面问题。建议加强下语言基础。
|
8
xuanbg 2021-06-04 14:49:21 +08:00
两重循环的变量都是 i ???你这个 i 到底是哪个 i ?
|
9
csfreshman OP @Yvette 确实是,内层循环 i 不应该变的,改成 j 就好了,感谢老铁。
|
10
csfreshman OP @junksheng 不,是你得 i
内层 for i 改成 j 就好了,还是右移 i 位。 |
11
csfreshman OP @yehoshua 感谢指出,已解决
|
12
junksheng 2021-06-05 01:31:28 +08:00 via Android
@csfreshman 就是说你的第二个 i 啊😯
|