目录
1.丢失的数字
题目描述:一个数组nums包含从0到n的整数,但其中丢失了一个数字,要求建立函数找出这个丢失的数字
思路1:先排序,后查找
对数组进行排序,排序后遍历找出那个丢失的数字
这么做可以解决,但如果数组元素过多的话这种方法就会耗费过多的时间
思路2:0~n的数字进行求和,数组中的元素也进行求和,二者相减,求出来的差便是丢失的数字
代码如下:
int missingNumber(int* nums, int numsSize){
int i=0,sum1=0,sum2=0;
while(i<=numsSize)
{
sum1+=i;
if(i<numsSize)
sum2=sum2+*(nums+i);
++i;
}
return sum1-sum2;
}
结果如图
思路3:异或
数组中所有的元素进行异或,然后再和0~n的数字进行异或,由于异或的性质(n^n=0),除那个丢失的数字外,其它元素都出现了两次,唯有丢失的数字只出现一次,所以最后异或的结果就是丢失的数字
代码如下:
int missingNumber(int* nums, int numsSize){
int x=0;
for(int i = 0;i < numsSize; ++i)
{
x=x^nums[i];
}
for(int j=0; j < numsSize+1; ++j)
{
x=x^j;
}
return x;
}
结果:
2.移动零
题目描述:给定数组nums,建立函数将数组中所有的0移动至末尾,同时非0元素的位置的相对顺序保持不变
思路:之前在解决移除序列中指定元素时提供过一种思路,博客链接https://blog.csdn.net/qq_52989768/article/details/121475627?spm=1001.2014.3001.5501
定义变量src、dst为0 ,它们的运动规律如下
1.当arr[src]不是要删除的值的时候,arr[dst]=arr[src],src++,dst++
2.当arr[dst]的值是要删除的值的时候,dst不动,src++
这里要移除的值便是0,当数组中所有的值都被移除后情况如下(力扣中示例的数组为[0,1,0,3,12]):
此时以dst为起点,src前一个元素为终点建立for循环,时nums[dst]的值为0
代码如下:
void moveZeroes(int* nums, int numsSize){
int dst=0;
int src=0;
int i=0;
while(src<numsSize)
{
if(nums[src]!=0)
{
nums[dst]=nums[src];
dst++;
src++;
}
else
{
++src;
}
}
for(i=dst;i<numsSize;++i)
{
nums[i]=0;
}
}
结果:
如果上述题目有更好的解法的话,欢迎补充
完