《剑指offer》第五十三题(0到n-1中缺失的数字)
// 面试题53(二):0到n-1中缺失的数字
// 题目:一个长度为n-1的递增排序数组中的所有数字都是唯一的,并且每个数字
// 都在范围0到n-1之内。在范围0到n-1的n个数字中有且只有一个数字不在该数组
// 中,请找出这个数字。 #include <iostream>
//可以用等差数列求和得到A,然后求数组全部数字和B,然后A-B是缺失的数字,但是该算法时间复杂度是O(n),没有利用递增排序的特点
//可将问题转化为,使用二分查找思想找出第一个数字和下标不等的数字
int GetMissingNumber(const int* numbers, int length)
{
if (numbers == nullptr || length <= )
return -; int left = ;
int right = length - ;
while (left <= right)
{
int middle = (right + left) >> ;
if (numbers[middle] != middle)
{
if (middle == || numbers[middle - ] == middle - )//如果中间点的下标和值不等,且前一个点的下标和值相等,则找到了
return middle;
right = middle - ;
}
else
left = middle + ;
} if (left == length)
return length; // 无效的输入,比如数组不是按要求排序的,
// 或者有数字不在0到n-1范围之内
return -;
} // ====================测试代码====================
void Test(const char* testName, int numbers[], int length, int expected)
{
if (testName != nullptr)
printf("%s begins: ", testName); int result = GetMissingNumber(numbers, length);
if (result == expected)
printf("Passed.\n");
else
printf("Failed.\n");
} // 缺失的是第一个数字0
void Test1()
{
int numbers[] = { , , , , };
int expected = ;
Test("Test1", numbers, sizeof(numbers) / sizeof(int), expected);
} // 缺失的是最后一个数字
void Test2()
{
int numbers[] = { , , , , };
int expected = ;
Test("Test2", numbers, sizeof(numbers) / sizeof(int), expected);
} // 缺失的是中间某个数字0
void Test3()
{
int numbers[] = { , , , , };
int expected = ;
Test("Test3", numbers, sizeof(numbers) / sizeof(int), expected);
} // 数组中只有一个数字,缺失的是第一个数字0
void Test4()
{
int numbers[] = { };
int expected = ;
Test("Test4", numbers, sizeof(numbers) / sizeof(int), expected);
} // 数组中只有一个数字,缺失的是最后一个数字1
void Test5()
{
int numbers[] = { };
int expected = ;
Test("Test5", numbers, sizeof(numbers) / sizeof(int), expected);
} // 空数组
void Test6()
{
int expected = -;
Test("Test6", nullptr, , expected);
} int main(int argc, char* argv[])
{
Test1();
Test2();
Test3();
Test4();
Test5();
Test6();
system("pause");
return ;
}
《剑指offer》第五十三题(0到n-1中缺失的数字)的更多相关文章
- 《剑指offer》第十三题(机器人的运动范围)
// 面试题:机器人的运动范围 // 题目:地上有一个m行n列的方格.一个机器人从坐标(0, 0)的格子开始移动,它 // 每一次可以向左.右.上.下移动一格,但不能进入行坐标和列坐标的数位之和 // ...
- 《剑指offer》第二十三题(链表中环的入口结点)
// 面试题23:链表中环的入口结点 // 题目:一个链表中包含环,如何找出环的入口结点?例如,在图3.8的链表中, // 环的入口结点是结点3. #include <iostream> ...
- 《剑指offer》第四题(二维数组中的查找)
// 二维数组中的查找 // 题目:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按 // 照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个 // 整数,判断数组 ...
- 剑指Offer的学习笔记(C#篇)-- 数组中重复的数字
题目描述 在一个长度为n的数组里的所有数字都在0到n-1的范围内. 数组中某些数字是重复的,但不知道有几个数字是重复的.也不知道每个数字重复几次.请找出数组中任意一个重复的数字. 例如,如果输入长度为 ...
- 剑指Offer(三十三):丑数
剑指Offer(三十三):丑数 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https://blog.csdn.net/baidu_31 ...
- 剑指Offer(二十三):二叉搜索树的后序遍历序列
剑指Offer(二十三):二叉搜索树的后序遍历序列 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https://blog.csdn.ne ...
- 剑指offer第五章
剑指offer第五章 1.数组中出现次数超过一半的数 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字. 例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}.由于数字2在数组 ...
- 【剑指Offer面试题】 九度OJ1517:链表中倒数第k个结点
鲁棒性是指程序可以推断输入是否符合规范要求,并对不和要求的输入予以 合理的处理. 题目链接地址: http://ac.jobdu.com/problem.php?pid=1517 题目1517:链表中 ...
- 剑指 Offer 09. 用两个栈实现队列 +java中栈和队列的使用
剑指 Offer 09. 用两个栈实现队列 题目链接 class CQueue { private Stack<Integer> sta1; private Stack<Intege ...
- [持久更新] 剑指offer题目Python做题记录
第一题 题目:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 思路:先快速定位到 ...
随机推荐
- python opencv 检测特定颜色
import cv2 import numpy as np cap = cv2.VideoCapture(0) # set blue thresh 设置HSV中蓝色.天蓝色范围 lower_blue ...
- pyqt5界面切换
#主要的思路就是创建两个frame(如果有两个以上同理)使用setVisible()函数显示或者隐藏frame 参数是bool值import sys from PyQt5.QtWidgets impo ...
- fjwc2019 D4T1 循环流
#187. 「2019冬令营提高组」循环流 假的网络流,其实是O(1)算法 手画n个图后,你会发现只要分成几种情况讨论讨论就得了. 当$a==1$时显然不存在. 当$a!=1$时 如果$n==2$,显 ...
- 通过注册表regedit对Windows回收站进行恢复
误删资料恢复 一不小心,删错了,还把回收站清空了,咋办啊? 只要三步,你就能找回你删掉并清空回收站的东西 步骤: 1.单击"开始——运行,然后输入regedit(打开注册表) 2.依次展开: ...
- Django使用多数据库
有些项目可能涉及到使用多个数据库的情况,方法很简单. 1.在settings中设定DATABASE 比如要使用两个数据库: DATABASES = { 'default': { 'NAME': 'ap ...
- 尚硅谷面试第一季-12Linux常用服务类相关命令
课堂重点: 实操命令及运行结果: (centos 6) service network status chkconfig --list chkconfig --level 5 network off ...
- Google Protocol Buffer在vs2010下配置
1.从这里下载protobuf-2.6.1.tar.gz到桌面,并解压,解压后的文件夹为protobuf-2.6.1.(我的桌面为C:\Users\mcl\Desktop) 2 .进入文件夹proto ...
- Linux 双向 SSH 免密登录
原理 双向,顾名思义,双方互通,此处的意思是多台 linux 两两免密登录.双向比单向多了些操作,单向只需把某一个linux的公钥发送给其他linux即可,而双向要实现集群中的每一台机器都保存其他所有 ...
- 二进制枚举例题|poj1222,poj3279,poj1753
poj1222,poj3279,poj1753 听说还有 POJ1681-画家问题 POJ1166-拨钟问题 POJ1054-讨厌的青蛙
- Centos 安装R
1 下载R源代码 原码下载地址https://cloud.r-project.org/https://cloud.r-project.org/src/base/R-3/R-3.4.2.tar.gz 2 ...