当前位置:  首页>> 技术小册>> 数据结构与算法(中)

题目描述

一个长度为 n-1 的递增排序数组中的所有数字都是唯一的,并且每个数字都在范围 0n-1 之内。

在范围 0n-1n 个数字中有且只有一个数字不在该数组中,请找出这个数字。

样例

  1. 输入:[0,1,2,4]
  2. 输出:3

解法

找出第一个与下标不对应的数字即可。

特殊情况:

  • 下标都对应,那么应该返回 最后一个数+1
  • 缺失的数字是第一个,那么返回 0。
  1. /**
  2. * @author bingo
  3. * @since 2018/12/8
  4. */
  5. class Solution {
  6. /**
  7. * 获取0~n-1缺失的数字
  8. *
  9. * @param nums 数组
  10. * @return 缺失的数字
  11. */
  12. public int getMissingNumber(int[] nums) {
  13. if (nums == null || nums.length == 0) {
  14. return 0;
  15. }
  16. int n = nums.length;
  17. int start = 0, end = n - 1;
  18. while (start <= end) {
  19. int mid = start + ((end - start) >> 1);
  20. if (nums[mid] != mid) {
  21. if (mid == 0 || nums[mid - 1] == mid - 1) {
  22. return mid;
  23. }
  24. end = mid - 1;
  25. } else {
  26. start = mid + 1;
  27. }
  28. }
  29. return start == n ? n : -1;
  30. }
  31. }

测试用例

  1. 功能测试(缺失的数字位于数组的开始、中间或者末尾);
  2. 边界值测试(数组中只有一个数字 0);
  3. 特殊输入测试(表示数组的指针为空指针)。

该分类下的相关小册推荐: