268. Missing Number
一、题目
1、审题
2、分析
求出一个数组中连续的元素中缺失的那一个。
二、解答
1、思路
方法一、
将数组中的元素与下标进行对应。最终与下标不一致的元素即为缺失德那一个。
public int missingNumber(int[] nums) { int end = nums.length - 1; for (int start = 0; start <= end; start++) { if(nums[start] > end || nums[start] == start) continue; int tmp = nums[start]; nums[start] = nums[tmp]; nums[tmp] = tmp; start--; } for (int start = 0; start <= end; start++) { if(nums[start] != start) return start; } return end + 1; }
方法二、
采用异或 ^ 运算符。将下标与元素值一起做 ^ 操作。出现了两次的元素最终会被消去,只剩下要求的出现一次的元素。
public int missingNumber2(int[] nums) { int re = 0, i = 0; for (i = 0; i < nums.length; i++) re = re ^ i ^ nums[i]; return re ^ i; }
方法三、
采用求和方法。假若元素全部连续,将他们求和后再减去出现的元素值,剩下的即为未出现的元素值。
public int missingNumber3(int[] nums) { int len = nums.length; int sum = (0 + len) * (len + 1) / 2; for (int i = 0; i < len; i++) sum -= nums[i]; return sum; }
方法四、
先将数组排序,在采用二分法查找缺失德元素。排序后下标与元素值相等,则该元素及前部分都是完整的部分。若该元素与下标不对应,则缺失德元素在前部。
public int missingNumber4(int[] nums) { Arrays.sort(nums); int left = 0, right = nums.length, mid = (left + right) / 2; while(left < right) { mid = (left + right )/ 2; if(nums[mid] > mid) right = mid; else left = mid + 1; } return left; }
【推荐】2025 HarmonyOS 鸿蒙创新赛正式启动,百万大奖等你挑战
【推荐】博客园的心动:当一群程序员决定开源共建一个真诚相亲平台
【推荐】开源 Linux 服务器运维管理面板 1Panel V2 版本正式发布
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET MAUI项目中绑定Android库实现硬件控制的开发经历
· 糊涂啊!这个需求居然没想到用时间轮来解决
· 浅谈为什么我讨厌分布式事务
· 在 .NET 中使用内存映射文件构建高性能的进程间通信队列
· 一个 java 空指针异常的解决过程
· 干翻 Typora!MilkUp:完全免费的桌面端 Markdown 编辑器!
· 那些年我们一起追过的Java技术,现在真的别再追了!
· 记一次.NET MAUI项目中绑定Android库实现硬件控制的开发经历
· 从WebApi迁移到Minimal API?有了这个神器,小白也能10分钟搞定!
· 抛开官方库,手撸一个轻量级 MCP 服务端