leetcode:面试题 17.04. 消失的数字(找单身狗/排序/公式)

简介: leetcode:面试题 17.04. 消失的数字(找单身狗/排序/公式)

一、题目:

函数原型:int missingNumber(int* nums, int numsSize)

二、思路:

思路1

利用“找单身狗”的思路(n^n=0;0^n=n),数组中有0-n的数字,但缺失了一个数字x。将这些数字按位异或0-n所有数字,那么最后的结果为0^x,最终结果就是x。

思路2

先将数组排序(升序),遍历数组,如果前一元素+1 不等于 后一元素,则说明缺失的元素是前一元素+1。但是如果缺失的是0或者n,无法用上述方法解决,需要先判断排序后的首元素和尾元素是否等于0、n;如果不等于,确实的元素就是0或n。

 

思路3

等差数列求和,求0 ~(numsSize+1)的和,再减去数组的所有元素和,差值即为缺失的数字。

三、代码:

代码1

int missingNumber(int* nums, int numsSize)
{
  int result = 0;
  for (int i = 0; i < numsSize; i++)//按位与数组中所有数字
  {
    result ^= nums[i];
  }
  for (int i = 0; i <= numsSize; i++)//按位与0-n所有数字
  {
    result ^= i;
  }
  return result;
}

代码2

int cmp(const void* e1, const void* e2)
{
    return *(int*)e1 - *(int*)e2;
}
int missingNumber(int* nums, int numsSize)
{
    qsort(nums, numsSize, sizeof(int), cmp);
    if (nums[0] != 0)
        return 0;
    else if (nums[numsSize - 1] != numsSize)
        return numsSize;
    else
    {
        int i = 0;
        for (i = 0; i < numsSize - 1; i++)
        {
            if ((nums[i] + 1) != nums[i + 1])
                return nums[i] + 1;
        }
    }
}

代码3

int missingNumber(int* nums, int numsSize)
{
    int sum = (0 + numsSize) * (numsSize + 1) / 2;
    for (int i = 0; i < numsSize; i++)
    {
        sum -= nums[i];
    }
    return sum;
}


目录
相关文章
|
1月前
【LeetCode-每日一题】 删除排序数组中的重复项
【LeetCode-每日一题】 删除排序数组中的重复项
19 4
|
3月前
|
存储 算法
LeetCode第83题删除排序链表中的重复元素
文章介绍了LeetCode第83题"删除排序链表中的重复元素"的解法,使用双指针技术在原链表上原地删除重复元素,提供了一种时间和空间效率都较高的解决方案。
LeetCode第83题删除排序链表中的重复元素
|
3月前
|
开发者 索引 Python
这些年背过的面试题——LeetCode
本文是技术人面试系列LeetCode篇,一文带你详细了解,欢迎收藏!
|
3月前
|
算法 索引
LeetCode第34题在排序数组中查找元素的第一个和最后一个位置
这篇文章介绍了LeetCode第34题"在排序数组中查找元素的第一个和最后一个位置"的解题方法,通过使用双指针法从数组两端向中间同时查找目标值,有效地找到了目标值的首次和最后一次出现的索引位置。
LeetCode第34题在排序数组中查找元素的第一个和最后一个位置
|
3月前
|
存储 算法 Java
LeetCode初级算法题:反转链表+统计N以内的素数+删除排序数组中的重复项Java详解
LeetCode初级算法题:反转链表+统计N以内的素数+删除排序数组中的重复项Java详解
44 0
|
3月前
|
算法 索引 Python
【Leetcode刷题Python】34. 在排序数组中查找元素的第一个和最后一个位置(二分查找)
解决LeetCode "在排序数组中查找元素的第一个和最后一个位置" 问题的方法。第一种方法是使用两次二分查找,首先找到目标值的最左边界,然后找到最右边界。第二种方法是利用Python的list.index()方法,先正序找到起始位置,再逆序找到结束位置,并给出了两种方法的Python实现代码。
61 0
|
4月前
|
数据库
面试题ES问题之Elasticsearch的排序分页和高亮功能如何解决
面试题ES问题之Elasticsearch的排序分页和高亮功能如何解决
38 0
|
4月前
|
Python
155. 最小栈 力扣 python 空间换时间 o(1) 腾讯面试题
155. 最小栈 力扣 python 空间换时间 o(1) 腾讯面试题
|
4月前
|
存储 算法 索引
1124. 表现良好的最长时间段 (python) 前缀和 分类讨论 最大长度 力扣 面试题
1124. 表现良好的最长时间段 (python) 前缀和 分类讨论 最大长度 力扣 面试题
|
4月前
|
存储 算法
经典的滑动窗口的题目 力扣 2799. 统计完全子数组的数目(面试题)
经典的滑动窗口的题目 力扣 2799. 统计完全子数组的数目(面试题)