消失的数字


题目

1、数组nums包含从0到n的所有整数,但其中缺了一个。请编写代码找出那个缺失的整数。

示例1:

输入:[3,0,1]
输出:2

示例2:

输入:[9,6,4,2,3,5,7,0,1]
输出:8


思路1

解析

首先,题目中说道是0-n个数字里面缺少一个,我们可以将n个数字进行排序,然后再遍历整个数组,就可以找出其中缺少的数字。

比如示例1:
先将[3,0,1]进行排序,得到[0,1,3],然后将数组与n个数字进行比较,不同的就是要找的数字。

代码:

int missingNumber(int* nums, int numsSize){
 
//将数组中的所有数字进行冒泡排序
 for(int i=0;i<numsSize-1;i++)
 {
     int j=0;
     for (j=0;j<numsSize-1-i;j++)
     {
         if(nums[j]>nums[j+1])
         {
             int temp=nums[j];
             nums[j]=nums[j+1];
            nums[j+1]=temp;
         }
     }
 }

//将数组中的所有值跟N个数进行比较
int ret=0;
for (int i = 0;i<numsSize;i++)
{
   if(ret==nums[i])
   {
       ret++;
   }
}
return ret;
}
其中最需要注意的是排完序的比较环节。
弄清楚for循环语句中判断语句为啥是i<numsSize,而不是i<numsSize+1。这非常重要。

思路2

解析

题目中明确表明是0-n个数字中缺少一个,我们可以选择将0-n个数字相加,然后减去数组中所有的数的和,这样就能够得到那个消失的数字了。

比如示例1:
先将[3,0,1]中的每一个数字进行相加得到结果4,又因为数组的长度为3,
所以我们需要计算0、1、2、3这四个数的和,结果为6。
然后用6-4=2,所以这个2就是我们要找的消失的数字。

代码:

int missingNumber(int* nums, int numsSize){
    //计算0-N之间数字的和
    int ret1=0;
    int N=numsSize+1;
    for (int i=0;i<N;i++)
    {
        ret1+=i;
    }

    //计算nums数组中所有数字的和
    int ret2=0;
    for(int i=0;i<numsSize;i++)
    {
        ret2+=nums[i];
    }

    return ret1-ret2;
}
这一种发方法就简单了许多!

思路3

解析

采用异或的方法找出,题目中消失的数字。

两个相同的数异或得零。先将0-N个数进行异或得到一个ret,然后再将ret与所给数组中的每个数字进行异或,
最后所得的数字就是我们所求的数字。

代码:

int missingNumber(int* nums, int numsSize){
	
    int ret=0;
    int N = numsSize+1;
    
    for(int i=0;i<N;i++)
    {
    	//计算出0-N之间所有数的异或值
        ret^=i;
    }
    
    for(int i=0;i<numsSize;i++)
    {
    	//相同的数异或为0,所以最后只剩下消失的数字
        ret^=nums[i];
    }
    return ret;
}
该方法的难点就是:需要了解异或的计算,以及异或的特点,只要弄清楚这些,这个方法还是比较简单的。

总结

这个题目从我自身的角度来说,第二种和第三种是最好理解和操作的,第一种思路虽然比较清晰,但是再代码实现的时候,我自己出现了一些小问题,比较的那块代码出现了一些问题,主要还是自己的动手能力差了一些,以后继续加油。看着挺简单的,但是实际上花费了一点时间。

这也是我第一篇的博客,刚开始以为会比较容易,过程中却出现了一些阻碍。果然不能够眼高手低,还是要将自己所想的记录下来,才是真正转换成为自己的东西。

我相信那些诗和远方,会慢慢来到你的身边!

  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值