2018鏈家筆試題
一、一個含有n個元素的陣列,找出m個數使其和為K
動態規劃:只能找出一組,O(n^2)
找出所有參考上述;連結
// 列印和為n的組合,動規法,O(n^2) public static List<Integer> findSums(int[] a, int n) { boolean[] dp = new boolean[n + 1]; List<Integer>[] list = new ArrayList[101]; for (int i = 0; i < list.length; i++) { list[i] = new ArrayList<>(); } dp[a[0]] = true; list[a[0]].add(a[0]); for (int i = 1; i < a.length; i++) { for (int j = n; j >= a[i]; j--) { if (dp[j - a[i]]) { dp[j] = true; list[j].addAll(list[j - a[i]]); list[j].add(a[i]); } } if (dp[n]) { break; } } return list[n]; }
二、資料分組
題目描述
小組編號問題。輸入一組數【2,7,3,4,9】,表示第一組有2個人,編號為【1、2】,第二組有7個人編號為【3~9】,第三組有3個人編號為【10~12】,第四組有4個人編號為【13~16】,第五組有9個人編號為【17~25】。
現在求,編號為1、25、11的人分別在哪個組裡。
示例:
輸入
5
2 7 3 4 9
3
1 25 11
輸出
1 5 3
計算累加小組成員數,結合二分查詢,複雜度O( min(n, mlogn) )
public static void main(String[] args) { Scanner sc = new Scanner(System.in); while (sc.hasNext()) { int n = sc.nextInt(); int[] arr = new int[n]; arr[0] = sc.nextInt(); for (int i = 1; i < n; i++) { arr[i] = arr[i - 1] + sc.nextInt(); } int m = sc.nextInt(); int query = 0; int index = 0; for (int i = 0; i < m; i++) { query = sc.nextInt(); index = search(arr, query); System.out.print(index + " "); } } sc.close(); } public static int search(int a[], int target) { int left = 0; int right = a.length - 1; int mid = 0; while (left < right) { mid = left + (right - left) / 2; if (target >= a[mid]) { left = ++mid; } else { right = mid; } } return left + 1; }
三、3個有序陣列查詢第k個
1. 在每一個數組中取出第一個值,然後把它們放在一個大小為3的小根堆中。此步驟的時間複雜度為O(3)
2. 取出堆中的最小值, 然後把該最小值所處的陣列的下一個值放在陣列的第一個位置。此步驟的時間複雜度為O(lg 3).
3. 不斷的重複步驟二,直到去出k個或所有的陣列都為空。
建堆只建一次,複雜度為O(3);所以為O(3)+O(k*lg 3) = O(k)
public static int findKth(int[] a, int b[], int c[], int count) { PriorityQueue<Integer> s = new PriorityQueue<>(); int i = 0, j = 0, k = 0; s.add(a[i]); s.add(b[j]); s.add(c[k]); while (count > 1) { if (s.peek() == a[i]) { s.poll(); if (i + 1 < a.length) { s.add(a[++i]); } count--; continue; } if (s.peek() == b[j]) { s.poll(); if (j + 1 < b.length) { s.add(b[++j]); } count--; continue; } if (s.peek() == c[k]) { s.poll(); if (k + 1 < c.length) { s.add(c[++k]); } count--; continue; } } return s.peek(); }
相關推薦
2018鏈家筆試題
一、一個含有n個元素的陣列,找出m個數使其和為K 動態規劃:只能找出一組,O(n^2) 找出所有參考上述;連結 // 列印和為n的組合,動規法,O(n^2) public static List<Integer> findSums(int[] a
鏈家筆試題2(2018.4.8)
題目:在迷迷糊糊的大草原上,小紅撿到了n根木棍,第i根木棍的長度為i,小紅現在很開心。 她想選出其中的三根木棍組成美麗的三角形。 但是小明想捉弄小紅,想去掉一些木棍,使得小紅任意選三根木棍都不能組成三角形。 請問小明最少去掉多少根木棍呢? 輸入 本題包含若干組測試資料。 對於
鏈家筆試題總結
一、 var name="abc"; var person={ name:'cba', getName:function () { return this.name;
鏈家2018實習生前端筆試題
col 範圍 能夠 輸出 差值 int() result 序號 家裏 一、找出1到n中缺少的數 var str=‘1 5 7 8 9 10 11‘; var strArr=str.split(‘ ‘); for (var i = 0; i < strArr.leng
1~n的全排列--閱文集團2018校招筆試題
put ron class 校招 next() tostring return bsp 輸出格式 題目大意:給定整數n,求出1~n的全排列 示例 輸入:n=3 輸出:[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1] 1 im
網易2018實習生招聘筆試題-C++開發實習生演算法題
[程式設計題] 被3整除 時間限制:1秒 空間限制:32768K 小Q得到一個神奇的數列: 1, 12, 123,...12345678910,1234567891011...。並且小Q對於能否被3整除這個性質很感興趣。小Q現在希望你能幫他計算一下從數列的第l個到第r個(包含端點)有多少
順風2018秋招筆試題
對稱主義者小A定義了一種“雙節棍字串”:形式如同aa…bb…cc…,其中字元a的個數等於字元c的個數, 字元b的個數小於他們的個數。例如aaabccc,AACMM。給你一個字串,輸出該字串的最長雙節棍子串, 若沒有則輸出NULL,若有多個則輸出最靠前的一個。輸入字串的
網易遊戲互娛2018秋招筆試題-字元迷陣
1.題目描述 字元迷陣是一種經典的智力遊戲。玩家需要在給定的矩形的字元迷陣中尋找特定的單詞。 在這題的規則中,單詞是如下規定的: 1. 在字元迷陣中選取一個字元作為單詞的開頭; 2. 選取右方、下方、或右下45度方向作為單詞的延伸方向; 3.
騰訊2018秋招筆試題之小Q的歌單
題目描述: 小Q有X首長度為A的不同的歌和Y首長度為B的不同的歌,現在小Q想用這些歌組成一個總長度正好為K的歌單,每首歌最多隻能在歌單中出現一次,在不考慮歌單內歌曲的先後順序的情況下,請問有多少種組
觸寶科技2018校招筆試題
#include <iostream> #include <string> #include <vector> using namespace std; void find(vector<string>& ve,vect
華為2018春招筆試題
華為2018春招筆試(3月21日) 題目一 最長數字字串 給定一個字串,輸出字串中最長的數字串,並把這個數字串的長度輸出。 請一個在字串中找出連續最長的數字串,並把這個串的長度返回;如果存在長度相同的連續數字串,返回最後一個連續數字串; 注意
【網易】2018校招筆試題
一丶魔法幣 小易準備去魔法王國採購魔法神器,購買魔法神器需要使用魔法幣,但是小易現在一枚魔法幣都沒有,但是小易有兩臺魔法機器可以通過投入x(x可以為0)個魔法幣產生更多的魔法幣。魔法機器1:如果投入x
2018華為筆試題
程式碼: #include<iostream> using namespace std; int main() { long long n, M, N, list[51
今日頭條2018.8.12筆試題總結
今日頭條筆試題1(經典的floodfill問題): 具體可以參考leetcode 200題:Number of Islands 1. 一個球場C的球迷看臺可容納M*N個球迷。官方想統計一共有多少球迷群體,最大的球迷群體有多少人。 球迷選座特性:1. 1.同球迷群體會
阿里巴巴2018校招筆試題
前幾天做了阿里的2018的校招筆試題,我投的崗位是Java研發,在這裡跟大家分享下筆試題及我的解法。 1、 題目 由於當時時間比較緊,只有四十分鐘,但是題目也只有一道,可能我比較渣,所以時間很趕,沒來得及截圖,下面是我對題目的大致記憶。 大致意思是給定
華為2018年七月筆試題
題目描述 輸入一個字串,加密輸出,加密演算法如下:將每個字串轉換為二進位制數字,然後將這些二進位制數字分別逆序後再拼接,得到加密字串 思路分析:字串的每個字元都用ASCII碼錶示,要將字元轉換成二進位制數字,可以採用位運算,每次通過右移將最低位取出並且存入新的字串中,這樣
劍指Offer/滴滴2018校招筆試題-找出陣列中第K大元素-雙路快排實現
程式設計題例項 滴滴2018校招筆試題程式設計題2: 找出陣列中第K大的元素 輸入 45,66,58,22 2 輸出 45 程式設計原理 這道題與
大疆2018校招筆試題
大疆的題,挺複雜,最起碼描述是的。。。 底下的答案僅供參考,沒有一道是全部AC的。 //兩個小車,走一步能量消耗1,方向為1向右,-1為向左,首先輸入路途長度,然後輸入兩行,每行第一個為小車的能量,第二個位小車起始位置,第三個為方向。求幾個小車可以走出去? #includ
2018鏈家校招內推-大資料開發工程師筆試程式設計題
題目1(如下截圖所示): 分析:一個排序問題 C++實現: #include<iostream> using namespace std; void insertSort(int *a
今日頭條2018秋招筆試題(未完待續)
第一題: #include <iostream> #include <vector> #include <string> using namespace std; void helper(const vector<vecto