题目:
package com.nuo.day;
import java.util.Arrays;
/**
* @author nuo
* @version 1.0
* @description: 算法
* @date 2021/12/9 10:20
*/
public class day07 {
public static void main(String[] args) {
int[] nums1 = new int[]{3,0,1};
System.out.println(day07_.m1(nums1));
int[] nums2 = new int[]{0,1};
System.out.println(day07_.m2(nums2));
int[] nums3 = new int[]{9,6,4,2,3,5,7,0,1};
System.out.println(day07_.m3(nums3));
int[] nums4 = new int[]{0,1,2,3,4,5,6,8,9,10,11};
System.out.println(day07_.m4(nums4));
}
}
class day07_{
public static int m1(int[] nums){
int flag;
for (int i = 0; i < nums.length + 1; i++) {
flag = 0;
for (int j = 0; j < nums.length; j++) {
if (i == nums[j]){
flag = 1;
}
}
if (flag == 0){
return i;
}
}
return 0;
}
public static int m2(int[] nums){
Arrays.sort(nums);
for (int i = 0; i < nums.length; i++) {
if (i != nums[i]){
return i;
}
}
// 循环内未直接return ,则会剩余最大的那个数未判断(即为多余的数)
return nums.length;
}
public static int m3(int[] nums){
// 冒泡法倒序判断
for (int i = 0; i < nums.length - 1; i++) {
for (int j = 0; j < nums.length - i - 1; j++) {
if (nums[j] > nums[j + 1]){
int temp = nums[j];
nums[j] = nums[j + 1];
nums[j + 1] = temp;
}
}
if (nums[nums.length - i - 1] != nums.length - i){
return nums.length - i;
}
}
return 0;
}
public static int m4(int[] nums){
int left = 0;
int right = nums.length - 1;
Arrays.sort(nums);
// 防最后一个数超判断范围
if (nums[nums.length - 1] != nums.length ){
return nums.length;
}
// 二分法查找
while (true){
if (left == right){
return left;
}
if ((left + right) / 2 == (nums[(left + right) / 2])){
left = (left + right) / 2 + 1;
}else if ((left + right) / 2 < (nums[(left + right) / 2])){
right = (left + right) / 2;
}
}
}
}
代码运行截图: