题解 | #没有出现的编号# java
没有出现的编号
https://www.nowcoder.com/practice/875d705df65c401a905f574070e09320
import java.util.*; public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param nums int整型一维数组 * @return int整型一维数组 */ public int[] findMissingAndMaxNegative (int[] nums) { // write code here Arrays.sort(nums); int[] ans = new int[2]; ans[1] = Integer.MIN_VALUE; boolean flag1 = false; boolean flag2 = false; for (int i = 0; i < nums.length; ++i) { if (nums[i] < 0) { ans[1] = Math.max(ans[1], nums[i]); flag1 = true; } else { if (i > 0 && nums[i - 1] > 0 && nums[i] != nums[i - 1] + 1 && nums[i] != nums[i - 1]) { ans[0] = nums[i - 1] + 1; flag2 = true; break; } else if (((i > 0 && nums[i - 1] < 0) || i == 0) && nums[i] != 0 && nums[i] != 1) { ans[0] = 1; flag2 = true; break; } } } if (!flag1) { ans[1] = 0; } if (!flag2) { ans[0] = nums[nums.length - 1] >= 0 ? nums[nums.length - 1] + 1 : 1; } return ans; } }
使用Java语言编写的。
这道题考察的是对给定数组进行排序和查找操作。
代码中的解题思路是先对数组进行排序,然后初始化一个长度为2的新数组ans,ans[0]存储缺失的正整数,ans[1]存储负数中的最大值。然后使用两个标志变量flag1和flag2来记录是否找到了缺失的正整数和最大的负数。
遍历排序后的数组nums,如果当前元素小于0,表示为负数,将其与ans[1]比较并更新ans[1]的值为较大的那个数。如果当前元素大于等于0,表示为正数或零,判断相邻元素之间是否存在缺失的正整数。根据题目给出的条件,如果存在缺失的正整数,则更新ans[0]的值为缺失的正整数,并将flag2置为true,跳出循环。
根据flag1和flag2的值判断是否需要进行默认的赋值操作。如果flag1为false,说明数组中没有负数,将ans[1]的值设置为0。如果flag2为false,说明数组中没有缺失的正整数,将ans[0]的值设置为数组最后一个元素加1(若数组最后一个元素为负数,则设置为1)。
最终返回ans数组作为结果。