首页 > 其他分享 >3597、找到所有数组中消失的数字

3597、找到所有数组中消失的数字

时间:2023-02-14 14:03:52浏览次数:39  
标签:index 3597 数字 nums int List Assert 数组 new

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



示例 1:


输入:nums = [4,3,2,7,8,2,3,1]

输出:[5,6]

示例 2:


输入:nums = [1,1]

输出:[2]


提示:


n == nums.length

1 <= n <= 105

1 <= nums[i] <= n

进阶:你能在不使用额外空间且时间复杂度为 O(n) 的情况下解决这个问题吗? 你可以假定返回的数组不算在额外空间内。


来源:力扣(LeetCode)

链接:https://leetcode-cn.com/problems/find-all-numbers-disappeared-in-an-array

著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

package cn.fansunion.leecode.number;

import java.util.ArrayList;

import java.util.HashSet;

import java.util.List;

import java.util.Set;

/**

* 448. 找到所有数组中消失的数字<br/>

* 给你一个含 n 个整数的数组 nums ,其中 nums[i] 在区间 [1, n] 内。 <br/>

* 请你找出所有在 [1, n] 范围内但没有出现在 nums 中的数字,并以数组的形式返回结果。<br/>

*

* 来源:力扣(LeetCode) 链接:力扣

* 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

*

* @author [email protected]

*

* 2022-2-19

*/

public class FindAllNumbersDisappearedInAnArray {

/* 示例 1:



输入:nums = [4,3,2,7,8,2,3,1]

输出:[5,6]

示例 2:



输入:nums = [1,1]

输出:[2]





提示:



n == nums.length

1 <= n <= 105

1 <= nums[i] <= n

进阶:你能在不使用额外空间且时间复杂度为 O(n) 的情况下解决这个问题吗?

你可以假定返回的数组不算在额外空间内。

*/

/**

* 同MissingNumber这个算一类问题;不使用额外空间,但用了“返回数组”这个额外的空间; <br/>

* 疑问,能做到在原数组nums里修改就搞定吗?<br/>

* nums[4-1]=1

* 弊端:ArrayList,LinkedList,数据量很大时,超时了

*

* @param nums

* @return

*/

public List<Integer> findDisappearedNumberSet(int[] nums) {

//List<Integer> existList = new ArrayList<>(nums.length);

//用Set,16ms;用ArrayList和LinkedList超时了

Set<Integer> existList = new HashSet<>();

for (int index = 0; index < nums.length; index++) {

existList.add(nums[index]);

}

// 0表示有值,0不会和nums中的数字冲突

for (int num : existList) {

nums[num - 1] = 0;

}

List<Integer> notExistList = new ArrayList<>();

// 非0,表示没有值

for (int index = 0; index < nums.length; index++) {

if (nums[index] != 0) {

notExistList.add(index + 1);

}

}

return notExistList;

}

/**

* 需要额外的空间numsExist,代码更清晰(用时3ms)

*

* @param nums

* @return

*/

public List<Integer> findDisappearedNumbers(int[] nums) {

int[] numsExist = new int[nums.length];

for (int index = 0; index < nums.length; index++) {

final int num = nums[index];

numsExist[num - 1] = 1;

}

List<Integer> notExistList = new ArrayList<>();

for (int index = 0; index < numsExist.length; index++) {

if (numsExist[index] == 0) {

notExistList.add(index + 1);

}

}

return notExistList;

}

}
package test.leecode.isNumber;

import java.util.List;

import org.junit.Assert;

import org.junit.Test;

import cn.fansunion.leecode.number.FindAllNumbersDisappearedInAnArray;

/**

* @author [email protected]

*

* 2022-2-22

*/

public class FindAllNumbersDisappearedInAnArrayTest {



@Test

public void test() {

FindAllNumbersDisappearedInAnArray mn = new FindAllNumbersDisappearedInAnArray();

int[] nums2=new int[] {1,1};

int[] nums5=new int[] {1,3,4,2,2};

int[] nums11=new int[] {10,9,8,2,5,6,4,3,3,7,9};

Assert.assertEquals((Object)2,mn.findDisappearedNumbers(nums2).get(0));

Assert.assertEquals((Object)5,mn.findDisappearedNumbers(nums5).get(0));

final List<Integer> numList = mn.findDisappearedNumbers(nums11);

final Object actual1 = numList.get(0);

final Object actual11 = numList.get(1);

Assert.assertEquals(1,actual1);

Assert.assertEquals(11,actual11);

}



@Test

public void testSet() {

FindAllNumbersDisappearedInAnArray mn = new FindAllNumbersDisappearedInAnArray();

int[] nums2=new int[] {1,1};

int[] nums5=new int[] {1,3,4,2,2};

int[] nums11=new int[] {10,9,8,2,5,6,4,3,3,7,9};

Assert.assertEquals((Object)2,mn.findDisappearedNumberSet(nums2).get(0));

Assert.assertEquals((Object)5,mn.findDisappearedNumberSet(nums5).get(0));

final List<Integer> numList = mn.findDisappearedNumberSet(nums11);

final Object actual1 = numList.get(0);

final Object actual11 = numList.get(1);

Assert.assertEquals(1,actual1);

Assert.assertEquals(11,actual11);

}

}

标签:index,3597,数字,nums,int,List,Assert,数组,new
From: https://blog.51cto.com/fansunion/6056746

相关文章

  • 3604、猜数字大小
    猜数字游戏的规则如下:每轮游戏,我都会从1到n随机选择一个数字。请你猜选出的是哪个数字。如果你猜错了,我会告诉你,你猜测的数字比我选出的数字是大了还是小了。你可以通......
  • 3606、数组的度
    给定一个非空且只包含非负数的整数数组nums,数组的度的定义是指数组里任一元素出现频数的最大值。你的任务是在nums中找到与nums拥有相同大小的度的最短连续子数组,返......
  • 二维数组中的查找
    问题:矩阵从左至右、从上至下非递减顺序,查找target是否在数组中剑指Offer04.二维数组中的查找-力扣(LeetCode)方法一:标志数flag:选择左下角或者右上角为标志数;选择左下......
  • 每日一题.截断数组
    先特判,显而易见数组的前缀和必须是3的倍数,要不然分不成三份。然后就是遍历前缀和让它和1/3总和和2/3总和比,显然当第二个1/3也成立的时候就可以停止遍历,然后可以继续遍历或......
  • VBA遍历数组的2种方式
     1.情景展示VBA编程,如何对数组进行遍历?2.解决方案方式一:使用for循环Sub遍历数组1()'声明一个变量DimArrAsVariant'声明一个数字变量DimiAs......
  • C语言填空:数组a b c,c中元素包括a,但不在b中
    #include<stdio.h>//数组a中有8个不相等的元素,b中有5个不相等的元素,数组c中包含那些a中但不在b中的元素,并输出数组c各元素的值main(){inta[8],b[5],i,j,count;......
  • 88. 合并两个有序数组
    给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2,另有两个整数 m 和 n ,分别表示 nums1 和 nums2 中的元素数目。请你 合并 nums2 到 nums1 中,使合......
  • halcon 伪二维数组
    没找到二维数组的方式,使用伪二维数组(其实是一维向量)RegionAlignment_ROI1:=[724.615,1571.03,841.724,1903]RegionText_ROI1:=[986,1436,1282,1834]row1s_pos_RO......
  • java 数组转list的两种方式(可新增和删除list元素)
     方式一String[]array={"111","222","333"};List<String>list=Arrays.asList(array);//list.add("444");list.remove(0);如上图所示,不可进行新增或删除元素的操......
  • 科技在线,前程无忧!流辰信息服务平台与您一起开启数字化办公之旅!
    二十一世纪是经济快速发展的时代,更是科学力量不断加强的时代。在这样的年代里,谁掌握了科技,谁就能在激烈的市场竞争中站稳脚跟,拥有更多的话语权和主动权。随着数字化办公时......