今天主要学习了复杂度和作了2道题目
复杂度主要分为时间复杂度和空间复杂度
时间复杂度不是追求具体的执行时间,而是大体的计算基本语句执行的次数,用O()表示。
须要注意的是
一、系数能够忽略。
2.O(1)不是表示执行了一次,而是执行的次数为次数,通写为O(1),这一点须要特备注意。
空间复杂度计算的不是空间大小,而是计算变量的个数,同时也要注意O(1)不是表示只有一个变量,而是变量的个数为常数。
题目一:0-n的数组中消失了一个数,求数组中消失的一个数。
这道题的方法有不少,可是针对时间复杂度,最好用异或来作,经过让缺乏一个数的数组中每一个元素都相互异或,再将异或的结果与完整的数组异或,就能够获得消失的数。(异或,相同为0,不一样为1,异或是位运算,得一位位得比)
题目二:一个数组中,只有2个数出现了一次,其他的都出现了2次,求只出现一次的2个数。
思想主要是
一、将数组中的每一个元素都异或,获得的结果为出现一次的2个数的异或结果ret。
二、找出ret的中任意位置为1的位,由于若是有一位为1,说明这个位的对于这2个数是不同。
三、根据找到的位来将数组中全部数分离,该位为1的在一组,为0 的在一组。
四、将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()开辟。数组