顺序表vector--------练习题9题解
前言
今日天气晴朗,是一个值得睡觉的软绵绵的星期天,所以我今天起晚了一点,伴随着学习的进步,一些生活上的事情也随时间出现啦,妈妈的生日快到了,小魔丸的生日也快到了,我要着手开始准备生日礼物啦,一年两年前的我也许会慌不择路,现在的我也算是气定神闲啦,但也没有那么迎刃有余,所以要多问问朋友的建议,这样比较保险。精心准备的礼物不仅能让对方觉得受到关心和重视,而且可以留下美好的回忆,对于我来说也可以积攒经验,也算是一桩美事啦。
题目

解法
class Solution {
public:int duplicateNumbersXOR(vector<int>& nums) {int pro=0,ret=0;int size = nums.size();for(int i=0;i<size;i++){for(int j=i+1;j<size;j++){if(nums[i]==nums[j]){ret = nums[i];pro = ret^pro;break;}}}return pro;}
};
这是我自己的解法,利用两个变量缓存符合条件的值和位或结果,时间复杂度为O(n^2),空间复杂度为O(1).
优化解法
class Solution {
public:int duplicateNumbersXOR(vector<int>& nums) {long long m=0;//初始化为0int size = nums.size();int ans=0;for(int i=0;i<size;i++){if(m&((long long)1<<nums[i])){//1为long long类型ans=ans^nums[i];}else{m = m|((long long)1<<nums[i]);}}return ans;}
};
这个是老师的解法,利用位与运算和位或运算,将时间复杂度从O(n^2)优化为O(n),具体思路是利用一个标记位,就是一个全是0的50位数字串,然后遇到哪个数,就把1左移几位与这个数字串做位与运算,如果得1,则用ans与它做异或运算,如果得0,则通过位或运算,将1左移几位的数传入标记为中,核心逻辑就是利用这个标记位来判断数是否会出现两次,然后进行异或运算。
反思
1.考察知识点:按位XOR值就是两个数异或以后的结果,位运算中的位或和位与;
2.踩的坑:不清楚按位XOR值的意思,对位运算的运用不熟练;
3.可以优化的地方:利用标记位和位运算,降低时间复杂度。
