2017年网易校招笔试编程题第二题

1、题目
未曾将题目抄下,大致题意如下:
给定n个正整数组成的数列,找出取这n个正整数中的一部分数字求和所不能得到的最小数。

【输入】第一行:一个正整数n,为数列整整数的个数
第二行:n个正整数(由空格隔开)
【输出】取这n个正整数中的一部分数字求和所不能得到的最小数。

2、 举例
【输入】3
5 1 2
【输出】4

3、 我的思路
先将数组进行从小到大排序,然后依次检查数组中是否存在seed(1,2,3……)
(1) 如果存在与seed相等的数字,则seed加1,进入下一轮判断;
(2) 如果不存在与seed相等的数字但存在大于seed的数字,则跳出循环,并判断当前已经比较过的数字之和是否大于seed。如果大于,则已经比较过的这些数字肯定可以组合成seed,则seed加1进入下一轮判断,否则,已经比较过的这些数字肯定不能组合成seed,该seed符合条件;
(3) 如果数组中不存在大于等于seed的数字,则判断数组中所有数字之和是否大于seed。如果大于,那么数组中数字肯定可以组合成seed,则seed加1进入下一轮判断,否则,已经比较过的这些数字肯定不能组合成seed,该seed符合条件;

4、 实现如下:
以下实现通过所有测试用例。


import java.util.Arrays;
import java.util.Scanner;

public class Test2
{   
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        while (in.hasNextInt()) {
            int n = in.nextInt();
            int[] input = new int[n];            
            int sum = 0;

            //把输入的n个数存入数组
            for(int i =0; i < n; i++)
            {
                int temp  = in.nextInt();  
                sum += temp;
                input[i] = temp;
            }            
            Arrays.sort(input);           
            int seed = 1;           
            while(true)
            {
                int flag = 0;               
                int sum2 = 0;

                for(int k =0; k < n; k++)
                {                   
                    if(input[k] == seed)
                    {
                        flag = 1;
                        break;
                    }
                    if(input[k] > seed)
                    {
                        flag = 2;
                        break;
                    }
                    sum2 += input[k];
                }

                if(flag == 0 && seed > sum)
                {
                    System.out.println(seed);
                    break;
                }
                else if(flag == 1)
                {
                    seed ++;
                }
                else 
                {
                    if(sum2 < seed)
                    {
                        System.out.println(seed);
                        break;
                    }
                    seed ++;                    
                }
            }            
        }
    }
}

5、 考后反思
在写这篇博客的时候,我发现其实第3部分中的思路存在很多问题。
第3部分中第(3)种情况只可能发生在数组为1,2……n时,所以此时可以直接断定取这n个正整数中的一部分数字求和所不能得到的最小数是数组中所有数字之和加1,而不用再进行比较。

6、 修改后代码
以下实现未进行所有用例的测试。


import java.util.Arrays;
import java.util.Scanner;

public class Test2
{   
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        while (in.hasNextInt()) {
            int n = in.nextInt();
            int[] input = new int[n];            
            int sum = 0;

            //把输入的n个数存入数组
            for(int i =0; i < n; i++)
            {
                int temp  = in.nextInt();  
                sum += temp;
                input[i] = temp;
            }

            Arrays.sort(input);         
            int seed = 1;           
            while(true)
            {
                int flag = 0;               
                int sum2 = 0;               
                for(int k =0; k < n; k++)
                {                   
                    if(input[k] == seed)
                    {
                        flag = 1;
                        break;
                    }
                    if(input[k] > seed)
                    {
                        flag = 2;
                        break;
                    }
                    sum2 += input[k];
                }

                //可以之后断定符合条件的值
                if(flag == 0)
                {
                    System.out.println(sum+1);
                    break;
                }
                else if(flag == 1)
                {
                    seed ++;
                }
                else 
                {
                    if(sum2 < seed)
                    {
                        System.out.println(seed);
                        break;
                    }
                    seed ++;                    
                }
            }            
        }
    }
}

7、 总结
我在这里所写题目的解题思路,只是抛砖引玉,肯定还有很多大神有更好的实现方式,望不吝赐教,不胜感激。

你可能感兴趣的:(笔试面试题分享)