leetcode 137 问题讨论

2021-06-04 00:14:41 +08:00
 csfreshman

刷 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;
    }
};
2007 次点击
所在节点    程序员
12 条回复
Yvette
2021-06-04 01:03:18 +08:00
不等价,你的位运算里用的 i 不是同一个 i
junksheng
2021-06-04 01:05:10 +08:00
你的 i ?
jinliming2
2021-06-04 01:14:39 +08:00
方法二里的 i 是哪来的?
beidounanxizi
2021-06-04 01:37:07 +08:00
这道题 是 真值表的变形 数字电子逻辑设计 据说?
放弃吧 最佳复杂度是 O(N)
还有算比较好理解的 但是复杂度就高了 N²
Xs0ul
2021-06-04 02:01:02 +08:00
@beidounanxizi #4 从抽象代数的角度来说,真值表版本用的异或是有限域 F_2 上的加法(可以理解为相加以后再对 2 取余数)。这题只要变成 F_3 上的加法就可以了,也就是相加对 3 取余
Edcwsyh
2021-06-04 09:08:45 +08:00
为什么嵌套循环里还要用 'i'.....
yehoshua
2021-06-04 09:36:06 +08:00
你嵌套两个 i 就有奇怪,这应该是比较低级错误了属于基础方面问题。建议加强下语言基础。
xuanbg
2021-06-04 14:49:21 +08:00
两重循环的变量都是 i ???你这个 i 到底是哪个 i ?
csfreshman
2021-06-05 00:37:25 +08:00
@Yvette 确实是,内层循环 i 不应该变的,改成 j 就好了,感谢老铁。
csfreshman
2021-06-05 00:38:18 +08:00
@junksheng 不,是你得 i
内层 for i 改成 j 就好了,还是右移 i 位。
csfreshman
2021-06-05 00:38:33 +08:00
@yehoshua 感谢指出,已解决
junksheng
2021-06-05 01:31:28 +08:00
@csfreshman 就是说你的第二个 i 啊😯

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/781243

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX