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 == false) { ans[1] = 0; } if (flag2 == false) { ans[0] = nums[nums.length - 1] >= 0 ? nums[nums.length - 1] + 1 : 1; } return ans; } }
所使用的语言是Java。
这道题考察了以下知识点:
- 数组排序:使用
Arrays.sort(nums)
对数组进行排序,将数组元素按升序排列。 - 条件判断和循环控制:使用
if-else
语句和for
循环遍历数组,并根据特定条件执行相应的操作。 - 数组访问和赋值:使用
nums[i]
来访问数组的第i
个元素,并使用ans[0]
和ans[1]
来分别访问和赋值结果数组的第一个和第二个元素。
代码的文字解释如下:
- 使用
Arrays.sort(nums)
对给定的整数数组nums
进行升序排序。 - 创建一个大小为2的整数数组
ans
,并将所有元素初始化为0。ans[0]表示缺失的正整数,ans[1]表示最大的负整数。 - 设置两个布尔变量
flag1
和flag2
,初始化为false
,用于标记是否找到了缺失的正整数和最大的负整数。 - 使用
for
循环遍历排序后的数组nums
:如果当前数字小于0,更新ans[1]为当前数字和ans[1]中的较大值,并将flag1设置为true,表示找到了负整数。否则,根据一定的条件判断缺失的正整数:如果前一个数字大于0,并且当前数字不等于前一个数字加1且不等于前一个数字,表示前一个数字和当前数字之间存在缺失,则将ans[0]设置为前一个数字加1,并将flag2设置为true,表示找到了缺失的正整数。如果前一个数字小于0(或当前数字为数组的第一个元素),并且当前数字不等于0且不等于1,表示数组中缺失了1,将ans[0]设置为1,并将flag2设置为true。 - 根据
flag1
和flag2
的值判断是否需要对结果数组进行修正:如果flag1为false,表示未找到负整数,则将ans[1]设置为0。如果flag2为false,表示未找到缺失的正整数,则将ans[0]设置为数组中最后一个元素+1(如果最后一个元素大于等于0)或者1(如果最后一个元素小于0)。 - 返回结果数组
ans
作为答案。