2017年網易互連網內推筆試題-數字遊戲

來源:互聯網
上載者:User

原題如下:
小易邀請你玩一個數字遊戲,小易給你一系列的整數。你們倆使用這些整數玩遊戲。每次小易會任意說一個數字出來,然後你需要從這一系列數字中選取一部分出來讓它們的和等於小易所說的數字。 例如: 如果{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);        }    }}
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.