您的位置:首页 > 其它

2021-3-1

2021-03-01 22:30 337 查看

今天主要学习了复杂度和做了2道题目
复杂度主要分为时间复杂度和空间复杂度
时间复杂度不是追求具体的执行时间,而是大致的计算基本语句执行的次数,用O()表示。
需要注意的是
1、系数可以忽略。
2.O(1)不是表示执行了一次,而是执行的次数为次数,通写为O(1),这一点需要特备注意。
空间复杂度计算的不是空间大小,而是计算变量的个数,同时也要注意O(1)不是表示只有一个变量,而是变量的个数为常数。
题目一:0-n的数组中消失了一个数,求数组中消失的一个数。
这道题的方法有很多,但是针对时间复杂度,最好用异或来做,通过让缺少一个数的数组中每个元素都相互异或,再将异或的结果与完整的数组异或,就可以得到消失的数。(异或,相同为0,不同为1,异或是位运算,得一位位得比)
题目二:一个数组中,只有2个数出现了一次,其余的都出现了2次,求只出现一次的2个数。
思想主要是
1、将数组中的每个元素都异或,得到的结果为出现一次的2个数的异或结果ret。
2、找出ret的中任意位置为1的位,因为如果有一位为1,说明这个位的对于这2个数是不一样。
3、根据找到的位来将数组中所有数分离,该位为1的在一组,为0 的在一组。
4、将2组分别异或,得到的就是剩下的2个数。
关键代码:
while(m<32)
{
if(ret&(1<<m))
break;
else
m++;
} 这一段代码 是求出ret的m位为1;
for(i=0;i<numssize;i++)
{
if(nums[i]&(1<<i))
x1^=nums[i];
else
x2^=nums[i];
}这一段代码是将m位为1的和m位为0的分开出来,并分别异或。
另外注意一下 返回值应该是是一个数组的地址,因为要得到这2个数,得用数组保存起来,但是数组得起初大小不知道,所以使用动态内存开辟一个内存,即malloc()开辟。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: