C语言练习之消失的数字(两种解法)

简介: C语言练习之消失的数字(两种解法)

前言

题目描述:

数组nums包含从0n的所有整数,但其中缺了一个。请编写代码找出那个缺失的整数。你有办法在O(n)时间内完成吗?

测试举例:

输入:[3,0,1]

输出:2

一、思路

思路一(异或法)

首先要明白什么是异或(异或就是二进制位的数值,相等则为0,不相等则为1)

假设a!=b,则有以下公式:

a^a = 0;

a^b = b^a;

0^a = a;

根据公式可以想到:

先将0~n的所有数字全部异或

ret1 = 0^1^……^n;

再将数组(缺失数字)中的数全部异或

ret2 = nums[0]^nums[2]^……^nums[numsSize-1];

最后将ret1和ret2异或,所得结果就是缺失的数字。

思路二(求和法)

由观察可知,缺少的数字等于0~n数字之和减去0~n除了所缺少数字外其他数字之和。

二、代码

为了方便大家的交流和学习,我将函数的代码放置在下方。

代码1

int missingNumber(int* nums, int numsSize){
    int i = 0;
    int sum1 = 0,sum2 = 0;
    for(i = 0;i < numsSize +1; i++)//0~n个整数之和
    {
        sum1 += i;
    }
    for(i = 0; i < numsSize ;i++)//所给数组的元素之和
    {
        sum2 += nums[i];
    }
    return sum1 - sum2;
}

代码2

int missingNumber(int* nums, int numsSize){
    int i = 0;
    int ret1 = 0,ret2 = 0;
    for(i = 0;i < numsSize +1; i++)//0~n所有整数的异或
    {
        ret1 ^= i;
    }
    for(i = 0; i < numsSize ;i++)//所给数组的所有元素的异或
    {
        ret2 ^= nums[i];
    }
    return ret1^ret2;
}

总结

以上就是今天要讲的内容,本文简单的介绍了如何用C语言解决消失的数字这个题的思路。

这个题是我在做题时遇到的一道觉得很有意思的题,对我的做题思路有很大的启发作用,所以将它分享给大家。

如果本篇文章对你有所启发的话,希望可以支持支持作者,后续作者也会定期更新学习记录。谢谢大家!

相关文章
|
7月前
|
算法 C语言 容器
从C语言到C++_18(stack和queue的常用函数+相关练习)力扣(上)
从C语言到C++_18(stack和queue的常用函数+相关练习)力扣
51 0
|
7月前
|
C语言
LeetCode---消失的数字---C语言实现
LeetCode---消失的数字---C语言实现
|
7月前
|
C语言
C语言指针——练习
C语言指针——练习
|
7月前
|
编译器 C语言
C语言进阶⑪(指针上)(知识点和对应练习)回调函数模拟实现qsort。(下)
C语言进阶⑪(指针上)(知识点和对应练习)回调函数模拟实现qsort。
57 0
|
6月前
|
C语言
C语言练习代码第一篇
C语言练习代码第一篇
|
7月前
|
编译器 C语言 C++
从C语言到C++⑥(第二章_类和对象_中篇_续)大练习(日期类)+笔试选择题(下)
从C语言到C++⑥(第二章_类和对象_中篇_续)大练习(日期类)+笔试选择题
62 2
从C语言到C++⑥(第二章_类和对象_中篇_续)大练习(日期类)+笔试选择题(下)
|
6月前
|
C语言
C语言学习记录——操作符习题、算数转换习题,多解法&优解法&单选题
C语言学习记录——操作符习题、算数转换习题,多解法&优解法&单选题
33 1
|
7月前
|
存储 前端开发 算法
从C语言到C++_18(stack和queue的常用函数+相关练习)力扣(下)
从C语言到C++_18(stack和queue的常用函数+相关练习)力扣
27 0
|
6月前
|
C语言
|
6月前
|
存储 算法 C语言
【C语言刷题系列】消失的数字
【C语言刷题系列】消失的数字