1. 程式人生 > >網易2018內推筆試程式設計題

網易2018內推筆試程式設計題

題目1

題目描述

小易覺得高數課太無聊了,決定睡覺。不過他對課上的一些內容挺感興趣,所以希望老師講到有趣的地方的時候叫醒他一下。你知道了小易對一堂課每分鐘知識點的感興趣程度,並以分數量化,以及他在這堂課上每分鐘是否會睡著,你可以叫醒他一次,這會使得他在接下來的k分鐘內保持清醒。你需要選擇一種方案最大化小易這堂課聽到的知識點分值。

輸入描述

第一行n,k, (1 <= n, k <= 105),表示這堂課持續多少分鐘,以及叫醒小易一次使他能夠保持清醒的時間。
第二行 n個數,a1,a2,…,an(1<=ai<=104),表示小易對每分鐘知識點的感興趣評分。
第三行 n個數,t1,t2,…,tn,表示每分鐘小易是否清醒,1表示清醒。

輸出描述

小易這堂課聽到的知識點的最大興趣值。

示例

輸入

6 3
1 3 5 2 5 4
1 1 0 1 0 0 

輸出

16

思路1

  1. 我的思路是統計所有為 1 的 時間的興趣值,O(N)
  2. 再次遍歷,遇到為 0 的時候,統計 之後的 k 個數,並且跳過為 1 個數字不統計
  3. 比較並獲得最大值
  4. 這種方法的實質也算是暴力法,更好的方法應該是使用動態規劃

程式碼: AC 90%

import java.util.Scanner;

public class testkeshui {
    public static void main(String[] args) {
        Scanner sc = new
Scanner(System.in); int n = sc.nextInt(); int k = sc.nextInt(); sc.nextLine(); int[][] map = new int[n][2]; String[] str1 = sc.nextLine().split(" "); String[] str2 = sc.nextLine().split(" "); for (int i=0;i<n;i++){ map[i][0] = Integer.valueOf(str1[i]); map[i][1
] = Integer.valueOf(str2[i]); } int resultMax = 0; int curMax = 0; int wake = 0; //醒著的時間獲得的興趣值 for (int i=0;i<map.length;i++){ if (map[i][1] == 1){ wake += map[i][0]; } } for (int i=0;i<map.length;i++){ if (map[i][1] == 0){ if (map[i][1] == 0){ //從 i 開始,往後加上 k 個數 curMax = getSum(map,i,k); curMax = curMax+wake; } resultMax = Math.max(resultMax,curMax); } } resultMax = Math.max(resultMax,curMax); System.out.println(resultMax); } private static int getSum(int[][] map, int i,int k){ int res = 0; //接下來的 k 包含當前嗎? for (int j=0;j<k;j++){ if (i+j<map.length){ if (map[i+j][1] == 0) res += map[i+j][0]; } } return res; } }

題目二

題目描述

又到了豐收的季節,恰好小易去牛牛的果園裡遊玩。 牛牛常說他多整個果園的每個地方都瞭如指掌,小易不太相信,所以他想考考牛牛。 在果園裡有N堆蘋果,每堆蘋果的數量為ai,小易希望知道從左往右數第x個蘋果是屬於哪一堆的。 牛牛覺得問題太簡單了,所以希望你來替他回答。

輸入描述

第一行 一個數 n (1<= n <= 10^5)
第二行 n個數 ai (1<=ai<=1000),表示從左往右數第i堆有多少蘋果
第三行 一個數m (1<= m <= 10^5),表示有m次詢問
第四行 m個數qi, 表示小易希望知道第qi個蘋果屬於哪一堆。

輸出描述

m行,第i行輸出第qi個蘋果屬於哪一堆。

示例

輸入

5
2 7 3 4 9
3
1 25 11

輸出

1
5
3

思路

對蘋果數量求累加和,然後運用二分查詢即可

  1. 採用 Arrays.binarySearch() 的返回值
import java.util.Arrays;
import java.util.Scanner;

public class fengshou {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int[] apple = new int[n+1];
        int cur = 0;
        for (int i=1;i<=n;i++){
            cur += sc.nextInt();
            apple[i] = cur;
        }
        int m = sc.nextInt();
        while (m-->0){
            //Arrays.binarySearch() 如果沒有查詢到值: return -(low + 1);  // key not found.
            //只要拿到 low 的值即可輸出
         int index = Arrays.binarySearch(apple,sc.nextInt());
         if (index < 0){
             System.out.println(-index-1);
         }
         else {
             System.out.println(index);
         }

        }
    }
}
  1. 自己實現二分查詢
import java.util.Arrays;
import java.util.Scanner;

public class fengshou {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int[] apple = new int[n+1];
        int cur = 0;
        for (int i=1;i<=n;i++){
            cur += sc.nextInt();
            apple[i] = cur;
        }
        int m = sc.nextInt();
        while (m-->0){
            //Arrays.binarySearch() 如果沒有查詢到值: return -(low + 1);  // key not found.
            //只要拿到 low 的值即可輸出
         //int index = Arrays.binarySearch(apple,sc.nextInt());
         int index = binarySearch(apple,sc.nextInt());
         if (index < 0){
             System.out.println(-index-1);
         }
         else {
             System.out.println(index);
         }

        }
    }

    private static int binarySearch(int[] apple, int k){
        int start = 1; int end = apple.length-1;
        int mid = start - (start-end)/2;
        while (start <= end){
            if (apple[mid]>k){
                end = mid-1;
            }
            else if (apple[mid]<k){
                start = mid+1;
            }
            else {
                return mid;
            }
            mid = start - (start-end)/2;
        }
        return start;
    }
}

題目三

題目描述

給你n個a,m個z組成所有可能的字串,並將字串按字典序從小到大排列,輸出第k個字串。
若不存在,輸出-1。

輸入描述

第一行為三個數,分別為a的個數n,z的個數m,第k個字串。

輸出描述

第k個字串

示例

輸入

2 2 6

輸出

zzaa

思路

  1. 最開始的思路,將 a 和 z 放到一個 char 陣列中,然後執行回溯法,對組合全排列;AC 20%
import java.util.*;

public class test {
    private static TreeSet<String> res = new TreeSet<>();
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        while (in.hasNextInt()) {//注意while處理多個case
            int n = in.nextInt();
            int m = in.nextInt();
            int k = in.nextInt();
            char[] s = new char[n+m];
            for (int i=0;i<n;i++){
                s[i] = 'a';
            }
            for (int i=n;i<n+m;i++){
                s[i] = 'z';
            }
            getMax(s,0,n+m-1);
            Iterator itSet = res.iterator();
            while (itSet.hasNext() && k-->0){
                itSet.next();
                if (k==1) System.out.println(itSet.next());
            }
        }
    }
    private static void  getMax(char[] array,int i , int n){
        //全排列,回溯法:遞迴+迴圈
        if(i == array.length){//該組合排列完全,可以計算
            res.add(String.valueOf(array));
        }
        else{
            for(int k =i;k<=n;k++){//回溯
                swap(array,k,i);
                getMax(array,i+1,array.length-1);
                swap(array,k,i);
            }
        }
    }

    private static void swap(char[] array,int i, int j){
        char temp = array[i];
        array[i] = array[j];
        array[j] = temp;
    }
}
  1. 網上看的,別人採用 DFS 的方式,進行剪枝
package Interview.wangyi.wangyi_0811;

import java.util.ArrayList;
import java.util.Scanner;

public class zifuchuan {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int n = in.nextInt();
        int m = in.nextInt();
        int k = in.nextInt();
        ArrayList<String> list = new ArrayList<>();
        //深度優先儲存所有字串,然後取出第k個字串
        dfs(n,m,list,"");
        if (list.size()<k){
            System.out.println(-1);
        }
        else {
            System.out.println(list.get(k-1)); //從0開始
        }
    }

    //此處DFS ,對它進行了剪枝,迴圈次數大大減少,但是依然不適合資料量大的時候
    private static void dfs(int n , int m , ArrayList<String> list,String s){
        if (m==0 && n==0){
            list.add(s);
        }
        else {
            if (n>0){
               dfs(n-1,m,list,s+'a');
            }
            if (m>0){
                dfs(n,m-1,list,s+'z');
            }
        }
    }
}
  1. 動態規劃
import java.util.Scanner;

public class zifuchuan2 {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int n = in.nextInt();
        int m = in.nextInt();
        int k = in.nextInt();
        //構建dp陣列,計算每種選擇下的組合而成的字串個數
        int[][] dp = new int[n+1][m+1];
        //假設dp[i][j]表示i個a和j個z的方案數,根據上面這個公式列表計算我們可以發現:d[i][j] = dp[i-1][j] + dp[i][j-1];
        dp[0][0] = 1;
        for (int i=0;i<=n;i++){
            dp[i][0] = 1;
        }
        for (int j=0;j<=m;j++){
            dp[0][j] = 1;
        }
        for (int i=1;i<=n;i++){
            for (int j=1;j<=m;j++){
                dp[i][j] = dp[i-1][j] + dp[i][j-1];
            }
        }
        StringBuilder sb = new StringBuilder();

        //假設我們現在考慮輸出字串的第i個字元,如果當前選了a字元
        //假設後面剩餘字元a和z的個數是m1,n1,那麼後面所能組成的字串總數為dp[m1][n1]
        //如果k小於dp[m1][n1],那麼我們就能選a,因為後面組成的數目大於k,我們要選字元a來縮小這個組合數
        //否則,就選z,這時k -= dp[m1][n1],這是因為要減去a形成的方案數
            if (k>dp[n][m]){
                System.out.println(-1);
            }
            else {//計算出 第 k 個字元
                int n1 = n;
                int m1 = m;
                for (int i=0;i<m+n;i++){//字串長度
                    if (n1>0 && k<=dp[n1-1][m1]){//可以新增 a 到字串中
                        sb.append("a");
                        n1--;
                    }
                    else {
                        if (n1>0){//減去形成 a 形成的方案數
                            k -= dp[n1-1][m1];
                        }
                        sb.append("z");
                        m1--;
                    }
            }
        }
        System.out.println(sb.toString());
    }
}

相關推薦

2018筆試程式設計

題目1 題目描述 小易覺得高數課太無聊了,決定睡覺。不過他對課上的一些內容挺感興趣,所以希望老師講到有趣的地方的時候叫醒他一下。你知道了小易對一堂課每分鐘知識點的感興趣程度,並以分數量化,以及他在這堂課上每分鐘是否會睡著,你可以叫醒他一次,這會使得他在接

分蘋果——2017筆試程式設計

連結:https://www.nowcoder.com/questionTerminal/a174820de48147d489f64103af152709?source=relative來源:牛客網n 只奶牛坐在一排,每個奶牛擁有 ai 個蘋果,現在你要在它們之間轉移蘋果

分蘋果----2017筆試程式設計合集(一)

[程式設計題] 分蘋果 n 只奶牛坐在一排,每個奶牛擁有 ai 個蘋果,現在你要在它們之間轉移蘋果,使得最後所有奶牛擁有的蘋果數都相同,每一次,你只能從一隻奶牛身上拿走恰好兩個蘋果到另一個奶牛

2017筆試程式設計合集(二)(第三) 不要二

[程式設計題] 不要二 二貨小易有一個W*H的網格盒子,網格的行編號為0~H-1,網格的列編號為0~W-1。每個格子至多可以放一塊蛋糕,任意兩塊蛋糕的歐幾里得距離不能等於2。 對於兩個格子座標

2018春招筆試程式設計——nk數對

題目描述:牛牛以前在老師那裡得到了一個正整數數對(x, y), 牛牛忘記他們具體是多少了。 但是牛牛記得老師告訴過他x和y均不大於n, 並且x除以y的餘數大於等於k。 牛牛希望你能幫他計算一共有多少個可能的數對。首先用兩個for迴圈來暴力求解是可以得到結果,但是時

(2018校招筆試)[程式設計] 相反數

題目: 為了得到一個數的"相反數",我們將這個數的數字順序顛倒,然後再加上原先的數得到"相反數"。例如,為了得到1325的"相反數",首先我們將該數的數字順序顛倒,我們得到5231,之後再加上原先的數

(2018校招筆試)[程式設計] 魔法幣 Magic Coin

小易準備去魔法王國採購魔法神器,購買魔法神器需要使用魔法幣,但是小易現在一枚魔法幣都沒有,但是小易有兩臺魔法機器可以通過投入x(x可以為0)個魔法幣產生更多的魔法幣。 魔法機器1:如果投入x個魔法幣,

2018筆試程式設計(一)

萌新最近做了一下2018網易的內推程式設計題集合,要求3個小時解決八道程式設計題,本萌新兩個小時做了6道題,剩下兩道題直接放棄了,感覺難度不大,沒有具體涉及到什麼演算法,除了動態規劃。 下面對做題的思路以及過程做一個簡單的記錄: 1.彩色的磚塊: 一

2016校招筆試程式設計

牛牛想嘗試一些新的料理,每個料理需要一些不同的材料,問完成所有的料理需要準備多少種不同的材料。 輸入描述: 每個輸入包含 1 個測試用例。每個測試用例的第 i 行,表示完成第 i 件料理需要哪些材料,各個材料用空格隔開,輸入只包含大寫英文字母和空格,輸入檔案不超過 50

2017筆試程式設計——分田地

題目描述: 牛牛和 15 個朋友來玩打土豪分田地的遊戲,牛牛決定讓你來分田地,地主的田地可以看成是一個矩形,每個位置有一個價值。分割田地的方法是橫豎各切三刀,分成 16 份,作為領導幹部,牛牛總是會選擇其中總價值最小的一份田地, 作為牛牛最好的朋友,你希望牛牛取得的田地的價值和儘可能大,你知道這個值最大

2018計算機視覺實習生筆試程式設計

牛牛總是睡過頭,所以他定了很多鬧鐘,只有在鬧鐘響的時候他才會醒過來並且決定起不起床。從他起床算起他需要X分鐘到達教室,上課時間為當天的A時B分,請問他最晚可以什麼時間起床輸入描述:每個輸入包含一個測試用例。 每個測試用例的第一行包含一個正整數,表示鬧鐘的數量N(N<=1

2018美團點評筆試程式設計2

老師不想自己改試卷,於是讓大家互相改試卷。 把全班同學分為k組,每組有s(k)個同學, 老師先選擇一個組i,將這個組的所有試卷s(i)份都收上來放在講臺上 然後再選擇一個組j,從講臺上拿s(j)份試卷

2018搜狐筆試程式設計2

這個題我的想法是從大到小依次考慮 對於6*6的產品,每個產品需要一個包裹 對於5*5的產品,每個產品需要一個包裹,每個包裹剩下的空間最多可以裝下11個1*1的產品,根據包裹數量更新1*1產品的剩餘數

2017筆試題目

http://www.nowcoder.com/discuss/6959?type=3&order=0&pos=2&page=1 [程式設計題] 幸運的袋子 一個袋子裡面有n個球,每個球上面都有一個號碼(擁有相同號碼的球是無區別的)。如

2017筆試1:分蘋果 [python]

''' [程式設計題] 分蘋果 時間限制:1秒 空間限制:32768K n 只奶牛坐在一排,每個奶牛擁有 ai 個蘋果,現在你要在它們之間轉移蘋果, 使得最後所有奶牛擁有的蘋果數都相同,每一次,你只能

2018校招筆試)[程式設計] 字串碎片

一個由小寫字母組成的字串可以看成一些同一字母的最大碎片組成的。例如,”aaabbaaac”是由下面碎片組成的:’aaa’,’bb’,’c’。牛牛現在給定一個字串,請你幫助計算這個字串的所有碎片的平均長度是多少。 輸入描述: 輸入包括一個字串s,字串s的長度l

2017 [程式設計]小喜歡的數列

[程式設計題]小易喜歡的數列 熱度指數:1954時間限制:1秒空間限制:32768K 小易非常喜歡擁有以下性質的數列: 1、數列的長度為n 2、數列中的每個數都在1到k之間(包括1和k) 3、

2017春招筆試程式設計集合題解

前言 想想已經有一年多沒有接觸演算法題了,忙活了一年多沒什麼用的東西,才陡然發現自己竟然就要畢業了,然而審視了下自己的水平估計還達不到大一的程度,甚是驚恐。於是下定決心開始刷一點題,打好基本功。正好有同學在做網易筆試題的時候來向我問問題,我看了看有12道,好像也不多,於是就順便刷了刷。本

2019測試開發筆試程式設計第一(小俄羅斯方塊)

題目描述 小易有一個古老的遊戲機,上面有著經典的遊戲俄羅斯方塊。因為它比較古老,所以規則和一般的俄羅斯方塊不同。熒幕上一共有n列,每次都會有一個1x 1的方塊隨機落下,在同一列中,後落下的方塊會疊在先前的方塊之上,當一整行方塊都被佔滿時,這一行會被消去,並得到

2017春招筆試編程集合——分餅幹

out color div nbsp -1 pre new har nco 參考:http://blog.csdn.net/wwe4023/article/details/70171648的內容 // import java.util.*; public class M