1. 程式人生 > >2017年網易網際網路內推筆試題-數字遊戲

2017年網易網際網路內推筆試題-數字遊戲

原題如下:
小易邀請你玩一個數字遊戲,小易給你一系列的整數。你們倆使用這些整數玩遊戲。每次小易會任意說一個數字出來,然後你需要從這一系列數字中選取一部分出來讓它們的和等於小易所說的數字。 例如: 如果{2,1,2,7}是你有的一系列數,小易說的數字是11.你可以得到方案2+2+7 = 11.如果頑皮的小易想坑你,他說的數字是6,那麼你沒有辦法拼湊出和為6 現在小易給你n個數,讓你找出無法從n個數中選取部分求和的數字中的最小數。
輸入描述:

    輸入第一行為數字個數n (n ≤ 20)
    第二行為n個數xi (1 ≤ xi ≤ 100000)

輸出描述:

    輸出最小不能由n個數選取求和組成的數

輸入例子:

   3
   5 1 2

輸出例子:

   4

解題思路:求不能得到的最小數,那麼肯定是兩個數之和要比較小。也就是說,兩個數之和中得到的結果沒有這個數k,且k也不在被提供的列表裡面,那麼這個數就是要找的數。可以將得到的這組數任取兩個,求和,得到的結果儲存排序儲存在陣列中,然後將其與1-n的有序陣列比對,無法匹配的第一個數就是要找的最小數。

誤:按照上面這個思路,想不到怎麼求解。困住了。
去看答案:裡面有個比較好的思路。先將得到的輸入陣列排序,這樣得到一個有序的陣列。然後進行迴圈,迴圈次數最大值為陣列大小n。第i次迴圈將基準數temp增加a[i],基準數temp在迴圈前為0。當第i+1次迴圈時,a[i+1]的值大於temp+1,則表明此時湊不出(temp+1)這個數。停止迴圈,輸出temp+1即可。
這麼做的理由在哪裡?

引用塊內容

程式碼如下:

import java.util.*;

public class NumGame
{

    public static void main(String[] args)
    {
        Scanner in = new Scanner(System.in);
        while(in.hasNext()){
            int n = in.nextInt();
            int[] a = new int[n];
            for (int i = 0; i < n; i++)
            {
                a[i] = in
.nextInt(); } //呼叫Arrays的sort方法可直接對陣列進行排序 Arrays.sort(a); int base = 0; for (int i = 0; i < n; i++) { if (a[i]>base+1) { break; } base=base+a[i]; } System.out.println(base+1); } } }