数组nums
包含从0
到n
的所有整数,但其中缺了一个。请编写代码找出那个缺失的整数。你有办法在O(n)时间内完成吗?
#include<stdio.h>
/**
* @brief 数组nums包含从0到n的所有整数,但其中缺了一个。
* 请编写代码找出那个缺失的整数。你有办法在O(n)时间内完成吗?
*
* @param argc
* @param argv
* @return int
*/
/*
sort: 进行冒泡排序
*/
int* sort(int nums[],int numsize)
{
for (int i = 0; i < numsize-1; i++)
{
int flag=0;
for (int j = i; j <numsize-1-i ; j++)
{
if(nums[j]>nums[j+1])
{
int temp = nums[j+1];
nums[j+1]=nums[j];
nums[j]=temp;
flag=1;
}
}
if(flag==0)
{
return nums;
}
}
}
int missingNumber(int* nums, int numsSize){
#if 0
// 方法一: 对给定的数组进行排序,后一个数字减前一个数字>1则找到数字
int* num1 =sort(nums,numsSize);
for (size_t i = 0; i < numsSize-1; i++)
{
if((num1[i+1]-num1[i])>1)
{
return num1[i]+1;
}
}
#endif
// 方法二: 0-n个数字加起来 然后减去所给的数组的值的和 差值为所要找的数字 以空间换时间
#if 0
int temp=0;
int temp1= (1+numsSize)*numsSize/2;
while (numsSize--) // 复习记得是表达式的值 表达式和变量
{
temp=temp+nums[numsSize];
}
return temp1-temp;
#endif
// 方法三 : 大佬想的异或: 原理 0^ x = x x^y^x=y x^x =0
int num=0;
for (size_t i = 0; i < numsSize; i++)
{
num^=nums[i]; // 0 跟 任何数异或等于那个数本身 这里以后遍历数组里面的所有数
}
int j=0;
for ( j = 0; j < numsSize+1; j++)
{
num^=j; // j 跟 num中异或 相同的数为 0 不用管中间的数 只要最后有两个相同的数异或就为0 最终没有异或到的数就是那个要查找的数
}
return num;
}
int main(int argc, char const *argv[])
{
int nums[5]={0,1,2,3,5};
int date= missingNumber(nums,5);
printf("%d",date);
return 0;
}