牛牛的好朋友羊羊在纸上写了n+1个整数,羊羊接着抹除掉了一个整数,给牛牛猜他抹除掉的数字是什么。牛牛知道羊羊写的整数神排序之后是一串连续的正整数,牛牛现在要猜出所有可能是抹除掉的整数。例如:
10 7 12 8 11 那么抹除掉的整数只可能是9
5 6 7 8 那么抹除掉的整数可能是4也可能是9
输入包括2行:
第一行为整数n(1 <= n <= 50),即抹除一个数之后剩下的数字个数
第二行为n个整数num[i] (1 <= num[i] <= 1000000000)
在一行中输出所有可能是抹除掉的数,从小到大输出,用空格分割,行末无空格。如果没有可能的数,则输出mistake
2 3 6
mistake
import java.util.*; public class Main{ public static void main(String[] args){ Scanner in = new Scanner(System.in); int length = in.nextInt(); int[] numbers = new int[length]; for (int i = 0; i<length; i++){ numbers[i]=in.nextInt(); } if(length==1) { if(numbers[0]==1) { System.out.println(2); } else { System.out.print((numbers[0]-1) +" "+ (numbers[0]+1)); } } else { Arrays.sort(numbers); ArrayList<Integer> index = new ArrayList<Integer>(); for(int i = 0; i<length-1; i++){ if(numbers[i+1]-numbers[i]==0||numbers[i+1]-numbers[i]>2){ System.out.println("mistake"); return; } if(numbers[i+1]-numbers[i]==2) { index.add(i); } } if(index.size()==0) { if(numbers[0]==1) { System.out.print((numbers[length-1]+1)); } else { System.out.print((numbers[0]-1) +" "+ (numbers[length-1]+1)); } } else if (index.size()==1) { System.out.println(numbers[index.get(0)]+1); } else { System.out.println("mistake"); } } } }那些年躲不过的坑!!!!
import java.util.Arrays; import java.util.Scanner; public class Main { public static void main(String args[]) { Scanner sc = new Scanner(System.in); int n,k,count=0; n=sc.nextInt(); int[] a=new int[n]; for(int i=0;i<n ;i++) a[i]=sc.nextInt(); Arrays.sort(a); k=a[0];//把排序后数组的第一个数赋值给一个常量 for(int i=1;i<n;i++)//计算有多少个相邻数字差值大于1的情况存在,并把数量计入count { if(a[i]==a[i-1]+1) continue; else count++; } for(int i=0;i<n;i++,k++){//开始遍历数组,开始k的值和啊a[0]相同,每次k++寻找差值大于1的数 if(a[i]!=k&&a[i]==k+1&&count==1)//如果数组和k的值不相等,且整个数组中只有这一种情况存在(即count==1),则这个值为所求值 { System.out.print(k); System.exit(0); } else if(a[i]!=k&&a[i]!=k+1||count>1)//如果数组和k的值不相同,但是k和数组的差值大于1,则这种情况没有可能的数,并且如果count>1,也不存在 { System.out.print("mistake"); System.exit(0); } }//整个数组是一个有序数列,如果所有数之间的差值都为1,则进行如下判断 if(a[0]==1) {//如果这个数组第一个数为1,则只可能是末尾丢失,所求数位数组最后一个数+1 System.out.print(a[n-1]+1); } else System.out.print(a[0]-1+" "+(a[n-1]+1));//如果数组第一个数不是1,根据题意判断有两个值,即头-1尾+1 } }
public class Main {
public static void main(String[] args) {
java.util.Scanner sc = new java.util.Scanner(System.in);
int n = sc.nextInt();
int[] numbers = new int[n];
for (int i = 0; i < n; i++) {
numbers[i] = sc.nextInt();
}
guess(numbers);
}
private static void guess(int[] numbers) {
if (numbers.length == 0) {
mistake();
} else if (numbers.length == 1) {
print(numbers[0] - 1, numbers[0] + 1);
} else {
int min = numbers[0], max = numbers[0], sum = numbers[0], first = numbers[0];
boolean[] bitArr = new boolean[numbers.length * 2 + 1];
bitArr[numbers.length] = true;
for (int i = 1; i < numbers.length; i++) {
sum += numbers[i];
//以first为参照物,将数字对应位数置为true
int index = numbers[i] - first;
if ((index > 0 && index <= numbers.length) || (index < 0 && -index <= numbers.length)) {
bitArr[numbers.length - index] = true;
} else if (index != 0) {//数字间距离过大,无法连续
mistake();
return;
}
if (numbers[i] > max) {
max = numbers[i];
}
if (numbers[i] < min) {
min = numbers[i];
}
}
int actualCount = numbers.length;
//求不重复数字个数
int uniqueCount = 0;
for (int i = 0; i < bitArr.length; i++) {
if (bitArr[i]) {
uniqueCount++;
}
}
if (actualCount != uniqueCount) {
mistake();
return;
}
//期望的数字个数
int expectedCount = max - min + 1;
//缺少的数字个数
int lackCount = expectedCount - uniqueCount;
if (lackCount == 0) {//数列连续
print(min - 1, max + 1);
} else if (lackCount == 1) {//中间缺少一个
print(0, (max + min) * (numbers.length + 1) / 2 - sum);
} else {//缺少多个
mistake();
}
}
}
private static void mistake() {
System.out.println("mistake");
}
private static void print(int i, int j) {
if (i > 0) {
System.out.println(i + " " + j);
} else {
System.out.println(j);
}
}
}
}