劍指Offer/滴滴2018校招筆試題-找出陣列中第K大元素-雙路快排實現
程式設計題例項
滴滴2018校招筆試題程式設計題2:
找出陣列中第K大的元素
輸入
45,66,58,22
2
輸出 45
程式設計原理
這道題與
- 劍指Offer面試題29:陣列中出現次數超過一半的數字;
- 劍指Offer面試題30:陣列中最小的k個數;
本質上是相同的,都是在雙路快排的過程中(劍指Offer用的是單路快排,不如雙路高效簡單),當劃分值的下標與所求相同,將陣列分為大於劃分值與小於劃分值的兩部分,時間複雜度O(logN)小於順序遍歷的O(N)。
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
//輸入一行數字字串並轉化為整形陣列
Scanner input =new Scanner(System.in);
String inputString=input.nextLine();
String[] chars=inputString.split(" ");
int array[] = new int[chars.length];
for (int i = 0; i < chars.length; i++) {
array [i] = Integer.valueOf(chars[i]);
}
//輸入要查詢的第K大值
int K=input.nextInt();
System.out.println(new Main().quickSortFindMax(array,K));
}
public int quickSortFindMax(int[] array,int K) {
int start=0;
int end=array.length-1;
int index=-1;
while (true){
//返回當前分治元素的下標 下標<index的都是大於array[index] 反之則小於
index = partition(array, start, end);
//第K大元素對應的下標應該是K-1 當index==K-1 即找到了第K大元素
if(index==K-1)
break;
else if(index>K-1)
end=index-1;
else
start=index+1;
}
return array[index];
}
//核心部分 雙路快排將陣列分為兩部分
public int partition(int array[],int i,int j){
swap(array,i,randomInRange(i,j)); //隨機選取一個數作為分治的標準,並放在第一位;
int target=array[0];
int start=i+1; //從下一個元素開始遍歷
int end=j;
while(start<=end){
while (array[start]>target&&start<j)
start++;
while (array[end]<=target&&end>i) //注意一定是小於等於,否則end有可能一直停在j最後一位 end應該停留在最後一個大於等於target的元素
end--;
if (start<end)
swap(array,start,end);//交換target與最後一個大於等於target的元素並返回target的下標
}
swap(array,i,end); //最後的end指標指向最後一個>=target的數;
return end;
}
public static void swap(int array[],int i,int j){
int temp=array[i];
array[i]=array[j];
array[j]=temp;
}
public static int randomInRange(int i,int j){
if (i>j)
throw new IllegalArgumentException();
return (int) (i+Math.random()*(j-i+1));
}
}
執行結果
普通用例
45 666 7 -90
2
45
特殊用例
19
1
19
相關推薦
劍指Offer/滴滴2018校招筆試題-找出陣列中第K大元素-雙路快排實現
程式設計題例項 滴滴2018校招筆試題程式設計題2: 找出陣列中第K大的元素 輸入 45,66,58,22 2 輸出 45 程式設計原理 這道題與
劍指Offer(第二版)面試題3:陣列中的重複元素
從今天開始,學習劍指Offer(第二版)中的所有演算法題,並且用java實現一遍,同步更新Blog劍指Offer(第二版)面試題3:陣列中重複的數字題目一:找出陣列中重複的數字 (限定不可以重複數字是-1,如果沒有重複數字,返回-1) 在一個長度為n的數組裡得所有
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校招筆試題
#include <iostream> #include <string> #include <vector> using namespace std; void find(vector<string>& ve,vect
【網易】2018校招筆試題
一丶魔法幣 小易準備去魔法王國採購魔法神器,購買魔法神器需要使用魔法幣,但是小易現在一枚魔法幣都沒有,但是小易有兩臺魔法機器可以通過投入x(x可以為0)個魔法幣產生更多的魔法幣。魔法機器1:如果投入x
阿里巴巴2018校招筆試題
前幾天做了阿里的2018的校招筆試題,我投的崗位是Java研發,在這裡跟大家分享下筆試題及我的解法。 1、 題目 由於當時時間比較緊,只有四十分鐘,但是題目也只有一道,可能我比較渣,所以時間很趕,沒來得及截圖,下面是我對題目的大致記憶。 大致意思是給定
大疆2018校招筆試題
大疆的題,挺複雜,最起碼描述是的。。。 底下的答案僅供參考,沒有一道是全部AC的。 //兩個小車,走一步能量消耗1,方向為1向右,-1為向左,首先輸入路途長度,然後輸入兩行,每行第一個為小車的能量,第二個位小車起始位置,第三個為方向。求幾個小車可以走出去? #includ
《劍指offer》給定一顆二叉搜尋樹,請找出其中的第k大的結點。
題目:給定一顆二叉搜尋樹,請找出其中的第k大的結點。例如, 5 / \ 3 7 /\ /\ 2 4 6 8 中,按結點數值大小順序第三個結點的值為4。 解析:看到我寫的下面的程式碼,像一篇文章一樣的長,我也是醉了,先提交上去了。思想就是先來個層次遍歷二叉樹,得
2018騰訊內部調崗面試試題3——找出陣列中比左邊大比右邊的小的元素
題目:以時間複雜度O(n)從長度為n的陣列中找出同時滿足下面兩個條件的所有元素: (1)該元素比放在它前面的所有元素都大; (2)該元素比放在它後面的所有元素都小。 分析:面試官給的上面冗餘的描述
2018 CVTE 前端校招筆試題整理
簡單的 三欄布局 位置 back 左右 blue color for循環 結果 昨天晚上(7.20)做了CVTE的前端筆試,總共三十道題,28道多選題,2道編程題 。做完了之後覺得自己基礎還是不夠紮實,故在此整理出答案,讓自己能從中得到收獲,同時給日後的同學一些參考。 首先
2018京東校招筆試題-資料分析崗
題目大意是給出一個數字n,問a^b=c^d(1<=a、b、c、d<=n)這種式子的個數 1^2=1^1 1^1=1^2,這樣的算兩個,n<=100000. 首先分析題目,n的資料範圍肯定是不能暴力的,從其他同學的反饋也表示這題暴力只能過20% 此題的規律在
2018網易校招筆試題——web前端開發
週六同學參加網易校招筆試,她投的前端開發,我也順便看了兩眼,題目並不算很難。第二道程式設計還和京東校招筆試題一樣(雖然我沒做出來....)。 我只記得第一題... 然而當時並沒有幫我同學調出來.....但是剛才只用了十多分鐘就做完了...... 所以其實校招筆試題並不難 題
2018有贊校招筆試題
昨天晚上參加了有贊校招Java類筆試,題目總體難度適中,這裡我給大家分享一下這次筆試的三個程式設計題。 第一題: 1.題目 2.思路 我對這個題目的基本思路是用空格分隔字串得到字串陣列,該字串陣列元素可能是空,也可能是包含單詞和空格的字串。然後將
2018科大訊飛校招筆試題
原題如下: 爭吵 時間限制:C/C++語言 2000MS;其他語言 4000MS 記憶體限制:C/C++語言 65536KB;其他語言 589824KB 題目描述: 有 n 個人排成了一行佇列,每個人都有一個站立的方向:面向左或面向右。由於這 n 個人中每個人都很討厭其他的
2018華為校招筆試題
校招題1 字串重排給定一個原始字串,統計字串中各字元出現的次數,並按照ASCII碼遞增的順序依次輸出。例:原始字串為eeefgghh統計字串中各字元的出現次數: e : 3 f : 1 g : 2 h : 2重排字串輸
劍指offer: 棧的壓入和彈出序列
span boolean 結束 壓棧 輔助 == peek pty cnblogs 輸入兩個整數序列,第一個序列表示棧的壓入順序,請判斷第二個序列是否為該棧的彈出順序。假設壓入棧的所有數字均不相等。例如序列1,2,3,4,5是某棧的壓入順序,序列4,5,3,2,1是該壓棧序
校招筆試題編程技巧總結
hid sca 筆試 result div else 總結 class ash 技巧一://統計字符串s1的頻率 String s1 = in.nextLine(); //統計字符串s1的頻率 for (char c1 : s1.toCharAr
【劍指Offer學習】【所有面試題匯總】
tails 超過一半 奇數 正則表達式 detail 刪除 祖先 滑動窗口 翻轉單詞順序 劍指Offer學習 劍指Offer這本書已經學習完了,從中也學習到了不少的東西,現在做一個總的目錄,供自已和大家一起參考,學如逆水行舟,不進則退。只有不斷地學習才能跟上時候,跟得
劍指offer 22. 棧的壓入、彈出序列
原題 輸入兩個整數序列,第一個序列表示棧的壓入順序,請判斷第二個序列是否可能為該棧的彈出順序。假設壓入棧的所有數字均不相等。例如序列1,2,3,4,5是某棧的壓入順序,序列4,5,3,2,1是該壓棧序列對應的一個彈出序列,但4,3,5,1,2就不可能是該壓棧序列的彈出序列。(注意:這兩個
[劍指offer] -- 22.棧的壓入、彈出序列
題目描述 輸入兩個整數序列,第一個序列表示棧的壓入順序,請判斷第二個序列是否可能為該棧的彈出順序。假設壓入棧的所有數字均不相等。例如序列1,2,3,4,5是某棧的壓入順序,序列4,5,3,2,1是該壓棧序列對應的一個彈出序列,但4,3,5,1,2就不可能是該壓棧序列的彈出序列。(注意:這