本文主要是介绍数组中消失的数--------------------------Find All Numbers Disappeared in an Array448,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
Given an array of integers where 1 ≤ a[i] ≤ n (n = size of array), some elements appear twice and others appear once.
Find all the elements of [1, n] inclusive that do not appear in this array.
Could you do it without extra space and in O(n) runtime? You may assume the returned list does not count as extra space.
Example:
Input: [4,3,2,7,8,2,3,1]Output: [5,6]
// 因为Array中的元素是从1到n,所以减1将是0到n-1,它们是数组的索引。
//以输入[4.3.2.7.8.2.3.1]为例,通过减去1,它变为[3.2.1.6.7.1.2.0],这是一个索引数组。
//第一次迭代
//当i = 0时,它将nums [3]标记为负数,数组变为[4.3.2.-7.8.2.3.1]。
//当i = 1时,它将nums [2]标记为负数,数组变为[4.3.-2.-7.8.2.3.1]。
//当i = 2时,它将nums [1]标记为负数,数组变为[4.-3.-2.-7.8.2.3.1]。
//当i = 3时,它将nums [6]标记为负数,数组变为[4.-3.-2.-7.8.2.-3.1]。
//...
//...
//当i = 6时,它将nums [0]标记为负数,数组变为[-4.-3.-2.-7.8.2.-3.-1]。
//
//对于第二次迭代
//找到nums [4] = 8和nums [5] = 2> 0;
//这意味着4和5不在索引数组[3.2.1.6.7.1.2.0]中。
//通过添加1,5和6不在输入[4.3.2.7.8.2.3.1]
//返回[5.6]public static void main(String[] args) {int []nums= {4,3,2,7,8,2,3,1};List<Integer> findDisappearedNumbers = findDisappearedNumbers(nums);for(Integer num: findDisappearedNumbers) {System.out.print(num+" ");}}public static List<Integer> findDisappearedNumbers(int[] nums) {List<Integer> list=new ArrayList<>();for(int i=0;i<nums.length;i++) {int index=Math.abs(nums[i])-1;if(nums[index]>0) {nums[index]=-nums[index];} }for(int i=0;i<nums.length;i++) {if(nums[i]>0) {list.add(i+1);}}return list;}
这篇关于数组中消失的数--------------------------Find All Numbers Disappeared in an Array448的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!