leetcode.1 消失的数字题解

  1.题目链接

[面试题 17.04. 消失的数字](https://leetcode.cn/problems/missing-number-lcci/description/)

2.方法

    法1

首先先用排序将数组里的元素排成一个升序(或者降序),(这里讲的是升序)然后在用i去遍历整个数组,判i是否等于nums[i] , 若相等则就返回i, i即是数组中丢失的数字;

int cmp(void* e1, void* e2)
{
    return *(int*)e1 - *(int*)e2;
}
int findmiss(int* nums, int numssize)
{
    qsort(nums, numssize, sizeof(int), cmp);
    for (int i = 0; i < n; i++)
    {
        if (i == nums[i])
        {
            return i;
        }
        i++;
    }
}

知识回顾;C语言中的抑或(^)操作符的规律:

1.a^0=a;

2.a^a=0

下面我们将用异或操作符来解决这个问题

法2

先让tmp与0到numssize的数进行抑或,然后在让tmp与数组nums中的数字抑或,则最终消失的数字就是a

举个例子:找到b中消失的数字

int a[5]={0, 1 , 5 ,8 ,9}

int b[4]={0,1,5,9}

现在我们令C=0;

C先与a中的数据抑或,在与b中数字进行

即C^0^1^5^8^9^0^1^5^9

由知识回顾中可知道5^5=0;0^8=8

即这里消失的数字是8

同理可得法2成立

int findmiss(int* nums, int numssize)
{
    int tmp = 0;
    for (int i = 0; i <= numssize; i++)
    {
        tmp ^= i;
    }

    for (int j = 0; j < numssize; j++)
    {
        tmp ^= nums[j];
    }
    return tmp;
}

仅供参考

  • 11
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值