2017-04-15 60 views
0

Java新手在這裏。我正在練習數組問題,並且我對此問題有疑問:給定一個奇數長度的整數數組,查看數組中的第一個,最後一個和中間值,並返回最大值。陣列長度至少爲1.查找數組中的第一個,最後一個和中間值。返回最大的一個

我知道如何找到數組中的第一個,最後一個和中間值。然後我試着用if語句來解決這個問題。

我的代碼:

public int maxTriple(int[] nums) { 
    if(nums[0]>nums[(nums.length+1)/2-1]&&nums[0]>nums[nums.length-1]){ 
     return nums[0]; 
    }else if(nums[(nums.length+1)/2-1>]>nums[0]&&nums[(nums.length+1)/2-1>]> 
      nums[nums.length-1]){ 
     return nums[nums.length-1]; 
    }else{ 
     return nums[nums.length-1]; 
} 
} 

但我怎麼能修復我的代碼這個代碼不工作呢?

+0

開始通過觀察編譯錯誤並加以修復,然後從那裏... – alfasin

+2

你是否知道你返回nums [nums.length-1] ** **兩次**? –

+0

@ PM77-1對不起,我輸入錯誤,我原來的應該是'返回nums [(nums.length + 1)/ 2-1];' –

回答

0

首先,爲了使代碼更具可讀性/可理解性,您應該將感興趣的3個值分配給局部變量,並且應該在操作員周圍添加一些空格。

而且,由於你知道長度將是奇數,length/2就足以找到中間值:

int first = nums[0]; 
int middle = nums[nums.length/2]; 
int last = nums[nums.length - 1]; 

當你的if塊與return發言結束時,else變得多餘,雖然這一個風格問題。在這種情況下,它幾乎沒有什麼區別,但是在更復雜的代碼中,它可以對代碼複雜性產生重大影響。

當然,你的主要問題,如PM 77-1 pointed out

您是否知道,您將返回nums[nums.length-1]兩次

中間return語句返回錯誤的值:

if (first > middle && first > last) { 
    return first; 
} 
if (middle > first && middle > last) { 
    return middle; 
} 
return last; 

可以使用三元條件操作符來編寫在一個單獨的語句:

return (first > middle && first > last ? first : 
     middle > first && middle > last ? middle : last); 

可以使用Math.max()方法來簡化它:

return Math.max(Math.max(first, middle), last); 

或者你可以使用IntStream.max(),這是更好的,如果你有多個值:

return IntStream.of(first, middle, last).max().getAsInt(); 
+0

非常感謝您的回答!但是在找到奇數長度數組的中間值時,我應該使用'num [(nums.length + 1)/ 2-1]'?因爲我使數組長度均勻。 –

+0

@KanzakiAriaEcho你說過:*「給定**長度爲**的整數**」*。由於長度很奇怪,例如'9'除以'2'會得到'4'(截斷),其中*是大小爲9的數組的中間元素的索引。問題對於偶數大小的數組沒有什麼意義,因爲在這樣的數組中沒有* single *「middle」元素。 – Andreas

0

在第二否則,如果你有額外的「>」(也許這是一個拼寫錯誤)

而且,如果第二個條件是真的,你需要返回nums[(nums.length+1)/2-1

所以你需要修復它在這方法:

public int maxTriple(int[] nums) { 
     if(nums[0]>nums[(nums.length+1)/2-1]&&nums[0]>nums[nums.length-1]){ 
      return nums[0]; 
     }else if(nums[(nums.length+1)/2-1]>nums[0]&&nums[(nums.length+1)/2-1]>nums[nums.length-1]){ 
      return nums[(nums.length+1)/2-1]; 
     }else{ 
      return nums[nums.length-1]; 
     } 
    } 
0

既然你只在價值利益,而不是指數,你可以使用

public int maxTriple(int[] nums) { 
    int max = Math.max(nums[0], nums[nums.length - 1]); 
    return Math.max(max, nums[nums.length/2]); 
} 
相關問題