首页 > 试题广场 >

连续整数

[编程题]连续整数
  • 热度指数:4316 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解
牛牛的好朋友羊羊在纸上写了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
示例1

输入

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");
                 }
                          
         }
        }
       
}
那些年躲不过的坑!!!!
发表于 2020-04-03 08:34:52 回复(0)
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  }
}
发表于 2019-02-28 14:54:12 回复(0)
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);
        }
    }
}
编辑于 2018-01-26 11:21:01 回复(0)
//提供一个复杂度为O(n)的思路,首先找到输入最大值和最小值,再建一个临时数组长度为最大值-最小
//值+1,然后遍历一遍输入的数字,将输入数字-最小值作为临时数组的角标,将这些角标的值置为1,
//最后遍历一遍临时数组,如果其所有角标的值都为1则输出最小值-1和最大值+1,如果只有一个为0则
//输出相应的角标+最小值,如果两个以上为0则输出错误,但最小值为1的时候特殊处理一下。
import java.util.Scanner;
public class Main{
    public static void main(String[] args){
        Scanner scan=new Scanner(System.in);
        int[] input=new int[scan.nextInt()];
        for(int i=0;i<input.length;i++){
           input[i]=scan.nextInt();
        }
        int max=input[0],min=input[0];
        for(int i=0;i<input.length;i++){
            if(input[i]>max)
                max=input[i];
            if(input[i]<min)
                min=input[i];
        }
        int[] tmp=new int[max-min+1];//临时数组
        for(int i=0;i<input.length;i++){
            tmp[input[i]-min]=1;
        }
        int count=0,result=0;
        for(int i=0;i<tmp.length;i++){
            if(tmp[i]==0){
                count++;//统计角标为0的数量
                result=i+min;
            }
        }
        if(count==0){
            if(min==1)
                System.out.println(max+1);
            else
                System.out.println((min-1)+" "+(max+1));
        }
        else if(count==1)
            System.out.println(result);
        else System.out.println("mistake");
    }
}

发表于 2017-08-30 16:49:50 回复(0)
/*
参考的小风筝的答案,不过那个原答案不能通过所有测试用例,我加了个判断
*/


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=sc.nextInt();
int[] num=new int[n];
for(int i=0;i<n;i++){
num[i]=sc.nextInt();
}
if(n==1){
if(num[0]>1){
System.out.println(num[0]-1+" "+(num[0]+1));
}else{
System.out.println((num[0]+1));
}
}
Arrays.sort(num);
for(int i=0;i<n-1;i++){
if (num[i] == num[i+1]) {
System.out.println("mistake");
}
}
if(num[n-1]-num[0]>n){
System.out.println("mistake");
}else if(num[n-1]-num[0]==n){
for (int i = 0; i < n-1; i ++) {
if (num[i] + 2 == num[i+1]) {
System.out.println(num[i] + 1);
}
}
}else{
if (num[0] > 1&&n!=1) {
System.out.println(num[0] - 1 + " " + (num[n-1] + 1));
} else if(num[0]!=1&&n!=1){
System.out.println((num[n-1] + 1));
}
}
if(num[0]==1&&num[n-1]==n&&n!=1){//如果n==1&&num[0]!=1
System.out.println((num[n-1] + 1));
}
}

}

发表于 2017-03-24 16:17:43 回复(0)

热门推荐

通过挑战的用户