栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

力扣刷题(丢失的数字和移动零)

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

力扣刷题(丢失的数字和移动零)

目录

1.丢失的数字

2.移动零


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 

结果如图

思路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 

结果:

 如果上述题目有更好的解法的话,欢迎补充

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/648112.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号