1. 程式人生 > >劍指Offer/滴滴2018校招筆試題-找出陣列中第K大元素-雙路快排實現

劍指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就不可能是該壓棧序列的彈出序列。(注意:這