首页 > 解决方案 > 我们如何获得左右子数组和相同的数组的索引‽

问题描述

我已经完成了以下编程练习:数组的等边。声明如下:

您将获得一个整数数组。您的工作是获取该数组并找到一个索引 N,其中 N 左侧的整数之和等于 N 右侧的整数之和。如果没有索引会导致这种情况发生,请返回 - 1.

例如:

假设给定数组 {1,2,3,4,3,2,1}:您的函数将返回索引 3,因为在数组的第 3 个位置,索引左侧的总和 ({ 1,2,3}) 和索引右侧的和 ({3,2,1}) 都等于 6。

让我们看看另一个。给定数组 {1,100,50,-51,1,1}:您的函数将返回索引 1,因为在数组的第一个位置,索引左侧 ({1}) 和索引右侧的总和 ({50,-51,1,1}) 都等于 1。

最后一个:给定数组 {20,10,-80,10,10,15,35} 在索引 0 左侧是 {} 右侧是 {10,-80,10,10,15,35 } 添加时它们都等于 0。(本题空数组等于0)索引0是左右两边相等的地方。

注意:请记住,在大多数编程/脚本语言中,数组的索引从 0 开始。

输入:一个长度为 0 < arr < 1000 的整数数组。数组中的数字可以是正整数或负整数。

输出:最低的索引 N,其中 N 的左边等于 N 的右边。如果你没有找到符合这些规则的索引,那么你将返回 -1。

注意:如果给定一个包含多个答案的数组,则返回正确的最低索引。

我已阅读用户 JensPiegsa 提供的以下答案。在这里你有它的链接。

import java.util.stream.IntStream;

public class Kata {
  public static int findEvenIndex(int[] arr) {
    return IntStream.range(0, arr.length)
        .filter(n -> IntStream.of(arr).limit(n).sum() == IntStream.of(arr).skip(n + 1).sum())
        .findFirst().orElse(-1);
  }
}

我想知道是否有一种方法可以代替循环遍历左右子数组相等的 Instream 过滤,然后返回第一个;当我们返回第一个相等时就中断执行。

我想知道当我们只得到左右相等的子数组时,函数解决方案会是什么样子,而不是循环遍历它。

有了循环,我认为它可能是:

public class Kata {
  public static int findEvenIndex(int[] arr) {
    int left = 0, right = 0;

    for(int i = 0; i < arr.length; i++, left = 0, right = 0){
      for(int j = 0; j < i; j++){
        left += arr[j];
      }
      for(int k = arr.length - 1; k > i; k--){
        right += arr[k];
      }
      if(left == right) return i;  
    }
    return -1;
  }
}

怎么可能只用一个功能句来完成呢?

我还阅读过: 是否有一个子数组可以求和为目标? 找到总和最小的子数组的索引 通过删除子数组使数组左右两边的和相等

标签: javaarraysloopsfunctional-programmingsum

解决方案


如果你想要一个不是 O(n^2) 的解决方案:

    public Integer getfirstIndexEqual(Integer [] nums){
        Integer sum = 0;
        for (int i = 0; i < nums.length; i++){
            sum += nums[i];
        }
        Integer half = 0;
        for (int i=0; i< nums.length; i++){
            if (half.floatValue() == (sum-nums[i]) / 2){
                return i;
            }
            half += nums[i];
        }
        return -1;
    }

推荐阅读