1. 程式人生 > >Java原始碼-N個數字中第k個最大值的求解方法

Java原始碼-N個數字中第k個最大值的求解方法

翻開《資料結構》正文第一頁,作者問了個問題:N個數字中的第k個最大值怎麼計算? 作者認為,對於學程式設計兩年的人而言,這個問題應該可以拿下。 事實上,這是我剛學習程式設計,考計算機等級考試3、4級時的基本問題,當時是在別人寫好的C語言程式碼段裡,加上一個巢狀的for迴圈,就輕鬆搞定。 然而,10多年後,我決定用已經學了這麼久的Java來“徒手”寫個小程式,解決這個問題。 經驗: 1. 使用者輸入數字的個數不確定,不能用陣列來儲存使用者輸入的值,而採用ArrayList來儲存。 2. 最好先用紙筆預演一下,獲得一個大概的演算法,然後再寫程式碼、除錯。演算法沒搞清,直接寫程式碼,有點本末倒置之嫌。 3. 常用演算法,最好熟記,如果自己從零開始去琢磨,呵呵,你得感謝你老闆給你那麼多空閒時間。 程式碼如下:
<pre class="java" name="code">import java.util.Scanner;
import java.util.ArrayList;

//n個數,求最大的數字中的第k個
public class HelloSort {

	
	public static void main(String[] args){
		Scanner input=new Scanner(System.in);
		int count=0;
		ArrayList<Double> numbers=new ArrayList<Double> ();
		double entry=0;

		
		do {
			System.out.print("請輸入數字(輸入-1結束輸入):");
			entry=input.nextDouble();
			if(entry==-1)
				System.out.printf("已完成輸入%n");
			else
			{
				numbers.add((Double)entry);
				count++;
			}
		}
		while(entry!=-1);
		
		double[] sortedNumbers=new double[count];
		for (int i=0;i<count;i++)
			sortedNumbers[i]=numbers.get(i);
		
		/*核心演算法:用陣列中未排序部分的第一個數和其後面所有數字比較,如果後面數字大,則互換位置
		這樣可保證排在前面的數字是最大的,n個數需要迴圈n-1次*/
		double temp=0;
		for (int i=0;i<count-1;i++){
			for (int j=i+1;j<count;j++){
			if (sortedNumbers[j]>sortedNumbers[i]){
				temp=sortedNumbers[j];
				sortedNumbers[j]=sortedNumbers[i];
				sortedNumbers[i]=temp;
				}
			}
		}
		
		System.out.print("請輸入k值:");
		int k=input.nextInt();
		System.out.printf("共輸入了%d個數,分別為:",count);
		for (int i=0;i<count;i++){
			System.out.printf(numbers.get(i)+"\t");
		}
		System.out.printf("%n從大到小的排序為:");
		for (int i=0;i<count;i++){
			System.out.print(sortedNumbers[i]+"\t");
		}
		System.out.printf("%n最大的數字中的第"+k+"個為:"+sortedNumbers[k-1]+"%n%n");
	}

}

執行結果: 請輸入數字(輸入-1結束輸入):1.11
請輸入數字(輸入-1結束輸入):2.12
請輸入數字(輸入-1結束輸入):3.14159
請輸入數字(輸入-1結束輸入):1.414
請輸入數字(輸入-1結束輸入):-0.707
請輸入數字(輸入-1結束輸入):-2.235
請輸入數字(輸入-1結束輸入):5.325
請輸入數字(輸入-1結束輸入):6.876
請輸入數字(輸入-1結束輸入):16.50
請輸入數字(輸入-1結束輸入):205.0698
請輸入數字(輸入-1結束輸入):-1
已完成輸入
請輸入k值:6
共輸入了10個數,分別為:1.11 2.12 3.14159 1.414 -0.707 -2.235 5.325 6.876 16.5 205.0698 
從大到小的排序為:205.0698 16.5 6.876 5.325 3.14159 2.12 1.414 1.11 -0.707 -2.235 
最大的數字中的第6個為:2.12

相關推薦

Java原始碼-N數字k求解方法

翻開《資料結構》正文第一頁,作者問了個問題:N個數字中的第k個最大值怎麼計算? 作者認為,對於學程式設計兩年的人而言,這個問題應該可以拿下。 事實上,這是我剛學習程式設計,考計算機等級考試3、4級時的基本問題,當時是在別人寫好的C語言程式碼段裡,加上一個巢狀的for迴圈,

在程式定義一函式digit(n,k),它能分離出整數n從右邊數k數字,如digit(31859,3)=8,gigit(2076,5)=0.

#include<bits/stdc++.h>//遞迴 using namespace std; void fl(int n,int k) {k-=1; if(k==0)cout<<n%10; else fl(n/10,k); } int main(

分治演算法求n元素序列k的元素

     首先,我們應該設定產生隨機數的序列儲存在陣列中,然後我們應該最容易想到的是排序對吧,做一個降序排序,就很容易找到第k個大的元素。但是用排序演算法的話,時間複雜度最快的也是快速排序O(logn),如果我們使用分治演算法求得話,會得到一個線性的時間複雜度O(n)。分治演

java刪除長度為n的陣列pos位置的元素

public class Delete { public void delete(int[] a, int pos){ if(pos<0||pos>=a.length){ //

Java面試寶典——求陣列兩兩相加等於指定數的組合種數 + 如何找出陣列k小的數

求陣列中兩兩相加等於指定數的組合種數package demos.array; import java.util.Arrays; /** * @author wyl * @time 2018年7

【劍指offer】連結串列k結點

帶測試函式 package demo2; class Node { int data; Node next=null; public Node(int data) { this.data = data; } } package demo

返回單鏈表k節點(leet簡單篇八百七十六題)

給定一個帶有頭結點 head 的非空單鏈表,返回連結串列的中間結點。 如果有兩個中間結點,則返回第二個中間結點。 示例 1: 輸入:[1,2,3,4,5] 輸出:此列表中的結點 3 (序列化形式:[3,4,5]) 返回的結點值為 3 。 (測評系統對該結點序列化表述

找出陣列K小的數(快速排序)

問題描述:給定一個無序的陣列,從一個數組中找出第K個最小的數,例如,對於給定陣列序列{1,5,2,6,8,0,6},其中第4小的數為5。 演算法思路:採用快速排序,分而治之的思想,根據主元,每次Partiton以主元為軸,比它小的數在左邊,比它大的數在右邊,判

利用快排尋找陣列k元素

/* * 利用快排尋找陣列中第k個最大元素 */ public class FindFirstKElement { //快排 public static int getBaseIndex(int[] arr, int start, int end) { int base = arr[st

HDU 3388 與m,n 互質的k整數

HDU 3388 題意:求與m, n 互質的第k 個整數。 思路: AC程式碼: #include <stdio.h> #include <string.h> const int N = 1005; int phi

求一個二叉搜尋樹K

假設該顆二叉搜尋樹的總元素數大於等於K 解題思路:用STL容器的棧來實現 int kthSmallest(TreeNode* root, int k) { std::stack<TreeNode*> Stack; while

Java 找打單鏈表倒數k元素

單鏈表 auth sys int nod turn ++ util ear package List.www.cn; import java.util.ArrayList; /** * 在單鏈表中找打倒數第k個元素 * @author Administrator * *

已知一個數組int[98],該數組裡面儲存了0~99共100數字的98數字不重複,請用演算法算出0~99缺少的2數字是哪兩

public class Test24 {public static void main(String[] args) {int[] num=in();//生成陣列noNumber(num);//判斷不同的數} public static int[] in() {      int[] array = new

Java 定義一個整型陣列儲存10整數,利用程式把儲存在第一元素

public class Save{ public static void main(String[] args){ int a[]={9,45,11,22,33,44,51,65,21,200}; int Max=a[0

數字不能構成的數字(兩數字不同時為奇或同時為偶)

urn a* 數量 小朋友 mes 算法 大小 數字 ace 小明開了一家糖果店。他別出心裁:把水果糖包成4顆一包和7顆一包的兩種。糖果不能拆包賣。 小朋友來買糖的時候,他就用這兩種包裝來組合。當然有些糖果數目是無法組合出來的,比如要買 10 顆糖。 你可以用計算機測

字串重複字串的連續長度

對比兩個字串中,重複字串的最大連續長度   如:    string m_strA = "lgdglfsdafpganecw";   string m_strB = 

為什麼Java的float型大於long型?

文章目錄 問題:float是32位,long是64位,為什麼float表示的範圍比long大呢? 參考 問題:float是32位,long是64位,為什麼float表示的範圍比long大呢? 原因: 原因是,float與lo

求解N*N表格從0,0到n,n所過有權路徑的

有一個表格,從左上角到右下腳.每個路徑都有不同值.求經過的路徑所能累加的最大值. 可以用動態規劃,來實現. 說一下思路,請結合程式碼 matrix 有路徑值的二維表  table一個和matrix相同大小的空表;table上的每個點的值代表著到達這個點所需要的最大值

Java求型別的小值得方法

在《java基礎》一書中看到下面這樣一段話:於是自己用程式碼進行測試 我們發現,在用程式碼測試型別最值的時候,定義變數的時候使用的是基礎型別,但是,在型別後面的引用MAX_VALUE的時候,我們使用的是封裝型別; (該處有個注意點需要注意的是:在將_

Java為什麼float型大於long型?

最為一個常識,我們都知道浮點型在記憶體中佔用的是4個位元組的空間,而long型佔用的是8個位元組的空間。可是為什麼4個位元組的float型的最大值會大於long型的最大值呢?        我們都知道,float型別的範圍是:一3.403E38~3.403E38。而lo