接效果图做网站,卖wordpress主题,中国软文网官网,淄博网站seo公司目录 一题目#xff1a;
二思路汇总#xff1a;
三代码解答#xff1a; 一题目#xff1a; leetcode原题链接#xff1a;. - 力扣#xff08;LeetCode#xff09;
二思路汇总#xff1a; 思路#xff1a;如果直接对数组按位异或#xff0c;那么最后得到的是a^b
二·思路汇总
三·代码解答 一题目 leetcode原题链接. - 力扣LeetCode
二·思路汇总 思路如果直接对数组按位异或那么最后得到的是a^b因此要把它们分到不同的数组再按位异或。可想而知a与b不同的话 那么要么至少有一位不同则按位异或后至少有一个一因此可以用lowbit得到它的从末端数第一个一的位其余都是0 如000010000可以知道a与b只有一个数与它按位与后为整数否则为0.因此可以区分不同数组按位异或。 这里操作的都是补码如ret最后存在1的位即a与b不同的比特位被它包含 可以是11或者1001那么对应的负ret操作时候是补码就是01,10,11此时如果得到的bite位一定是lowbit,其余都是0 因此这个-ret可以保证对应的ret除了最后一位是1则-ret此处也是1其他相反 三·代码解答
class Solution {
public:vectorint singleNumber(vectorint nums) {unsigned int ret0;int a0,b0;for(auto i:nums)ret^i;int xret(~ret1);//得到lowbit两种写法//int xret(-ret);for(int j0;jnums.size();j){if(nums[j]x)a^nums[j];else b^nums[j];}return {a,b};}
};