我陷入了Java的第一个hackerrank挑战

时间:2018-08-05 12:21:26

标签: java arrays java-8 sum

这是一个简单的函数,应该返回数组元素(整数)的总和。约束条件是,不应有负整数,每个元素的值应小于1000。

https://www.hackerrank.com/challenges/simple-array-sum/problem

.Touched

我编写的函数到此结束。其余代码与在Hackerrank上显示的一样

public class Solution {

static int simpleArraySum(int[] ar, int arCount) {
  int res=0;

   if(arCount>=0){ 
     for (int i=0; i<=arCount; i++){
         if (ar[i]<1000){
         res += i;
         }
     }
   }
  return res;   

}

对于输入6(数组大小)和1,2,3,4,10,11(数组元素),代码返回21而不是31。我不明白为什么这样做。 / strong>

4 个答案:

答案 0 :(得分:2)

您正在汇总索引而不是元素。另外,如@Saikrishna Rajaraman所述,迭代到async function func() { .. }为止。因此,在您的arCount方法循环中进行更改:

simpleArraySum

收件人

for (int i=0; i < arCount; i++){
    if (ar[i]<1000){
        res += i;
    }
}

此外,您不需要条件for (int i=0; i < arCount; i++){ if (ar[i]<1000){ res += ar[i]; } } ,因为如果条件为负,则if(arCount>=0)中的块将不会运行。

答案 1 :(得分:1)

有两个问题

  • 您将添加索引,而不是添加数组的值。您的情况是(0 + 1 + 2 + 3 + 4 + 5 + 6)= 21。
  • for循环从 0到数组长度开始,而应该从 0到(数组长度-1) 1到数组长度

请尝试以下解决方案。

  static int simpleArraySum(int[] ar, int arCount) {
  int res=0;

  if(arCount>=0){  //can be ignored
     for (int i=0; i<=arCount-1; i++){
         if (ar[i]<1000){  // can be ignored
         res += ar[i];
         }
      }
   }
  return res;   

  }

此外,约束条件还用于输入数组中的输入值。在运行测试用例时,hackerrank会照顾好它。您不必显式地将它们添加到您的代码中。

答案 2 :(得分:1)

因为您标记了,所以我建议采用这种解决方案:

static int simpleArraySum(int[] ar) {// Note: not need to pass the length of the array
    return Arrays.stream(ar)
            .filter(i -> i >= 0 && i < 1000)
            .sum();
}

您可以使用:

System.out.println(simpleArraySum(new int[]{1, 2, 3, 4, 10, 11}));//31

我也解决了HackerRank测试,并且得到了:

Testcase0

其他测试是Testcase1Testcase2

答案 3 :(得分:0)

如今,随着Java中流的可用性,每当编写手动循环时,您都应该真正考虑是否确实需要。在这种情况下,您可以使用单线解决方案完全避免该问题。

static int simpleArraySum(int[] ar) {
    return Arrays.stream(ar).sum();
}

更少的代码,更少的错误机会,更少的调试时间。