繁体   English   中英

(如何)我可以让这个 Array 代码看起来更好吗? (Codingbat - Array-1 sum2)

[英](How) Can I make this Array code look better? (Codingbat - Array-1 sum2)

我是这个论坛和编程的新手,我有我的第一个问题:)

目标是返回数组中前两个整数的和。 我的解决方案在我添加的图片中。 有没有办法用更少的 if 来解决这个问题? (我知道我不必执行 for 循环,但我刚刚学会了它并想尝试一下:D)

谢谢大家的回答!

https://i.stack.imgur.com/hx06s.png

编辑:这是我的代码:

public int sum2(int[] nums) {

  int sum = 0;

  if(nums.length == 0){
    return sum;
  }

  if(nums.length == 1){
    return nums[0];
  }
  for(int i = 0; i < 2; i++){
    sum += nums[i];
  }
  return sum;
}

您可以在流中使用 limit() 方法

 public long sum2(int[] nums) {
      return Arrays.stream(nums).limit(2).sum();
   }

你可以用这种简单的方式处理它:

public int sum2(int[] nums) {

    if (nums.length == 0)
        return 0;

    if (nums.length == 1)
        return nums[0];

    return nums[0] + nums[1];
}

你不能从代码中删除两个if语句,除非你想让它不必要地复杂化,例如@axurefrog 在他的评论中写道:

public int sum2(int[] nums) {

    int sum = 0;

    for (int i = 0; i < nums.length && i < 2; i++)
        sum += nums[i]; 

    return sum;
}

您可以简单地执行此操作,而不会出现 if-else 问题

public int sum2(int[] nums)                                                     
{
    int sum = 0;
    for(int i = 0; i < nums.length && i < 2; i++) sum+=nums[i];
    return sum;
}

编辑:根据 Luca Murra 的评论,在 for 循环条件中添加i < nums.length以处理空数组

这将返回数组的前 n 个值的总和:

public int sum(int[] arr, int n) {
    int sum  = 0;
    int num = Math.min( arr.length, n );
    for( int i=0; i < num; i++ ) {)
        sum += arr[i];
    }
    return sum;
}

我是这个论坛和编程的新手,我有第一个问题:)

目的是返回数组中前两个整数的和。 我的解决方案在我添加的图片中。 有没有办法用更少的案例来解决这个问题? (我知道我不必执行for循环,但是我只是学到了,想尝试一下:D)

感谢您的所有答案!

https://i.stack.imgur.com/hx06s.png

编辑:这是我的代码:

public int sum2(int[] nums) {

  int sum = 0;

  if(nums.length == 0){
    return sum;
  }

  if(nums.length == 1){
    return nums[0];
  }
  for(int i = 0; i < 2; i++){
    sum += nums[i];
  }
  return sum;
}

这里有两个看起来“更好”的替代解决方案:

  • sum2()switch所以没有 if语句
  • sum3()带有nested ternary表达式,使其非常短。

避免多次return是一种很好的做法,这样您就可以保留算法的单个入口 - 简单的出口点,支持调试。

我已经把代码片段打包好了,这样你就可以通过一次复制/粘贴来尝试它们。

public class Main{

    public static int sum2(int[] nums) {

        int sum = 0;

        switch (nums.length) {
            case 0:
                break;
            case 1:
                sum = nums[0];
                break;
            default:
                sum = nums[0] + nums[1];
                break;
        }

        return sum;
    }


    public static int sum3(int[] nums) {

        return nums.length == 1 ? nums[0] : nums.length >= 2 ? nums[0] + nums[1] : 0;
    }


    public static void main(String []args){

        int[] nums1 = {11, 13, 1, 0};   // expected: 24
        int[] nums2 = {3};              // expected: 3
        int[] nums3 = {};               // expected: 0

        System.out.println("sum2: " + sum2(nums1));
        System.out.println("sum2: " + sum2(nums2));
        System.out.println("sum2: " + sum2(nums3));
        System.out.println(' ');
        System.out.println("sum3: " + sum3(nums1));
        System.out.println("sum3: " + sum3(nums2));
        System.out.println("sum3: " + sum3(nums3));

    }
}

输出:

sum2: 24                                                                                                                                   
sum2: 3                                                                                                                                    
sum2: 0                                                                                                                                    

sum3: 24                                                                                                                                   
sum3: 3                                                                                                                                    
sum3: 0                                                                                                                                    

如果您使用的是Java8或更高版本,并且想要一个更通用的解决方案(意思是 N 个数字的总和),您可以使用如下流:

public long sum2(int[] nums) {
    return Arrays.stream(nums).sum();
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM