[英]Algorithm to find the largest integer in array
我正在嘗試創建一個返回int的方法 - 發送數組中最大整數的值。 我希望這個方法工作的方法是在for循環中檢查數組的第一個和最后一個元素,並以中間方式工作。 所以i =第一個整數,k =最后一個整數。 當i = 0, k = n-1
(索引),當i = 1, k = n-2
如果你發現漂移i = 1, k = n-2
。 在每個循環中,它需要檢查if a[i]>a[k]
。 然后他們換位置。 然后我知道最大的數字在數組的前半部分,然后我希望它檢查那一半,所以最終最大的int在索引0。
我試過這樣的:
public static int maxOfArray(int[] a)
{
int length = a.length;
if(length<1)
throw new NoSuchElementException("Not at least one integer in array");
while (length > 1)
{
int k = length;
for(int i = 0; i < length/2; i++)
{
k--;
if(a[i]<a[k])
{
int j = a[i];
a[i] = a[k];
a[k] = j;
}
}
length /=2;
}
return a[0];
}
..但我真的沒有得到它......我很難“想象”這里發生了什么......但它並不總是有效......(盡管有時候)。
編輯另外:陣列{6,15,2,5,8,14,10,16,11,17,13,7,1,18,3,4,9,12}; 將吐出17作為最大的數字。 我意識到我必須修復奇怪的bug,但我想首先解決這個偶數長度的數組..
遇到length
時的錯誤是奇怪的。
在這些情況下,你“錯過”中間元素。
示例 :for input int[] arr = { 8, 1, 5, 4, 9, 4, 3, 7, 2 };
- 元素9
將與自身進行比較和檢查,但隨后減小length
大小,從下一個要迭代的數組中排除9
。
我相信它可以通過將問題減少到ceil(length/2)
而不是length/2
(並處理length==1
特殊情況)來解決
注釋中提到的另一個問題是:你需要迭代到length/2
而不是length
,否則你要壓倒自己。
最后 - 標志是錯誤的 。
if(a[i]>a[k])
應該
if(a[i]<a[k])
請記住 - 如果第一個元素小於第二個元素,則嘗試交換元素,以便將較大的元素推送到數組的頭部。
但我真的不明白......我很難“想象”這里發生了什么......但它並不總是有效......(盡管有時候)。
在這種情況下,您應該使用調試器來逐步執行代碼,以獲得每行代碼的作用。
我會做的是:
public static int maxOfArray(int[] a) {
int max = a[0];
for (int i : a)
if (max < i)
max = i;
return max;
}
public static int findMaxTheHardWay(int[] array) {
for (int length = array.length; length > 1; length = (length + 1) / 2) {
for (int i = 0; i < length / 2; i++) {
if (array[i] < array[length - i - 1])
array[i] = array[length - i - 1]; // don't need to swap.
}
}
return array[0];
}
public static void main(String... args) {
Random rand = new Random(1);
for (int i = 1; i <= 1000; i++) {
int[] a = new int[i];
for (int j = 0; j < i; j++) a[j] = rand.nextInt();
int max = maxOfArray(a);
int max2 = findMaxTheHardWay(a);
if (max != max2)
throw new AssertionError(i + ": " + max + " != " + max2);
}
}
這是一個解決問題的瘋狂方法,但我會一起玩。
問題出在內循環中。
如果仔細觀察,你會注意到如果我們交換了第一次交換中的元素,我們也會在最后一次交換中交換它們; 即我們將取消第一次掉期的影響。 並且這同樣適用於整個陣列切片。
看到?
你需要做的是中途停止內循環......然后考慮length
為奇數的情況。
順便說一句,我之所以稱之為“相當瘋狂”,是因為明顯而簡單的方法要快得多: O(N)
與O(NlogN)
int a[] = {1,7,3};
List<Integer> list = Arrays.asList(a);
Integer largest = Collections.max(list);
這將為您提供Array中最大的數字。
這是一個符合您想要的規格的解決方案(與此處的其他許多不同,humm,humm):
final Integer[] input = {1, 2, 6, 32, 4, 44 ,12, 42, 3, 7, 17, 22, 57, 23, 102, 103 };
int half = (input.length / 2);
int mod = input.length % 2;
while (half >= 0) {
for (int i = 0, j = (half * 2) + mod - 1; i <= half && j >= half; i++, j--) {
if (input[i] < input[j]) {
final int tmp = input[i];
input[i] = input[j];
input[j] = tmp;
}
}
if (half == 0) break;
half = half / 2;
mod = half % 2;
}
//Here, input[0] = the biggest number in the original input.
編輯:添加mod,如果最后一個元素是最大的,它可以工作..
我認為你的代碼是有效的,你只需要在奇數數組的情況下使用長度/ 2,但我的測試會返回正確的結果:
package org.devince.largestinteger;
import java.util.NoSuchElementException;
public class LargestInteger {
final static int[] input = {1, 2, 6, 32, 4, 44 ,12, 42, 3, 7, 17, 22, 57, 23, 102, 103 };
// final static int[] input = { 8, 1, 5, 4, 9, 4, 3, 7, 2 };
// final static int[] input = {1,3,7};
/**
* @param args
*/
public static void main(String[] args) {
System.out.println(String.valueOf(maxOfArray(input)));
}
public static int maxOfArray(int[] a)
{
int length = a.length;
if(length<1)
throw new NoSuchElementException("Not at least one integer in array");
while (length > 1)
{
int k = length;
for(int i = 0; i < length; i++)
{
k--;
if(a[i]>a[k])
{
int j = a[i];
a[i] = a[k];
a[k] = j;
}
}
length = (int) Math.ceil(length / 2f);
}
return a[0];
}
}
為什么不將數組的第一個值存儲到變量max
。
之后只需從第二個位置開始循環直到最后一個,在循環中只檢查當前值是否大於max
如果更大則只分配max
。
返回max
,您的號碼最大。
public int FindLargest()
{
int[] num = { 1, 2, 5, 12, 13, 56, 16, 4 };
int max = num[0];
for (int i = 1; i <num.length; i++)
{
if (num[i] > max)
{
max = num[i];
}
}
return max;
}
同樣你也可以接近,
int length = a.length;
while (length > 1)
{
int k = length;
for(int i = 0; i < length; i++)
{
for(int y = k-1; y >= i; y--)
{
if(a[i]<a[y])
{
int j = a[i];
a[i] = a[y];
a[y] = j;
}
}
}
length /=2;
}
final int validSampleRates[] = new int[]{
5644800, 2822400, 352800, 192000, 176400, 96000,
88200, 50400, 50000, 4800,47250, 44100, 44056, 37800, 32000, 22050, 16000, 11025, 4800, 8000};
ArrayList <Integer> YourArray = new ArrayList <Integer> ():
for (int smaple : validSampleRates){
YourArray.add(smaple);
}
Integer largest = Collections.max(YourArray);
System.out.println("Largest " + String.valueOf(largest));
最好的方法是使用將List Collection擴展為ArrayList的Array
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.