2017-04-15 70 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]); 
} 
相关问题