1. 程式人生 > >2018鏈家筆試題

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的人分別在哪個組裡。

示例: 
輸入 

2 7 3 4 9 

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