当前位置: 首页> 财经> 访谈 > 在线设计软件免费版_网络科技公司简介模板_b站暴躁姐_一键清理加速

在线设计软件免费版_网络科技公司简介模板_b站暴躁姐_一键清理加速

时间:2025/7/10 7:10:31来源:https://blog.csdn.net/qq_26818839/article/details/144039566 浏览次数:1次
在线设计软件免费版_网络科技公司简介模板_b站暴躁姐_一键清理加速

题目:448. 找到所有数组中消失的数字

给你一个含 n 个整数的数组 nums ,其中 nums[i] 在区间 [1, n] 内。请你找出所有在 [1, n] 范围内但没有出现在 nums 中的数字,并以数组的形式返回结果。

解题思路

依据题目,有两种解题方式:

第一种是暴力破解,直接创建一个1到n的数组,与传入的数组对比,利用数组自带的函数,得出数组中消失的数字;(数组长度很长时,会超时)

第二种:在数据中判断数字是否为正确位置,如果是,则不需要修正,如果不是,则与正确位置的数字进行交换,直到遍历完所有数据;再进行第二次遍历新的数组,记录位置不正确的数字。

第三种:是看的其他人的解法,很巧妙,整体也是遍历两次数组,第一次遍历,通过数组的数字 x ,判断 x-1 是否有数字且数字大于1, 则将该位置数字 *-1 并赋值给 x-1 位置,这里乘 -1是进行标记,表示数字存在;第二次遍历新数据,数组中大于0的数字存入结果,即是数组中没有的数字。

解题过程

第一种:

class Solution {// 数组长度很大时会超时public List<Integer> findDisappearedNumbers(int[] nums) {List<Integer> a = new ArrayList<>();for (int i = 0; i < nums.length; i++) {a.add(i + 1);}for (int j = 0; j < nums.length; j++) {a.remove(Integer.valueOf(nums[j]));}return a;}  }

第二种:

class Solution {public List<Integer> findDisappearedNumbers(int[] nums) {List<Integer> res = new ArrayList<>();int n = nums.length;// 交换位置,如果位置正确 或者数值与对应的位置数值相同,则不需要交换int i = 0;while (i < n) {if (nums[i] == i + 1) {i++;continue;}int index = nums[i] - 1;if (nums[i] == nums[index]) {i++;continue;}// 交换位置int temp = nums[i];nums[i] = nums[index];nums[index] = temp;}for (int j = 0; j < nums.length; j++) {if (nums[j] != j + 1) {res.add(j + 1);}}return res;}
}

第三种:

public List<Integer> findDisappearedNumbers(int[] nums) {List<Integer> res = new ArrayList<>();int n = nums.length;for (int i = 0; i < n; i++) {// 获取当前值,如果当前值作为索引(值-1)存在对应的值,则赋予负值int num = Math.abs(nums[i]);int index = num - 1;if (nums[index] > 0) {nums[index] *= -1;}}for (int j = 0; j < nums.length; j++) {if (nums[j] > 0) {res.add(j + 1);}}return res;}

关键字:在线设计软件免费版_网络科技公司简介模板_b站暴躁姐_一键清理加速

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

责任编辑: