java - 我们如何获得左右子数组和相同的数组的索引‽
问题描述
我已经完成了以下编程练习:数组的等边。声明如下:
您将获得一个整数数组。您的工作是获取该数组并找到一个索引 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;
}
}
怎么可能只用一个功能句来完成呢?
解决方案
如果你想要一个不是 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;
}
推荐阅读
- git - 如何删除旧的有问题的 git 提交
- php - 如果用户未登录重定向所有页面
- react-native - 如何删除下划线和占位符文本之间的空格?
- c# - Enforce business rules out of Aggregate
- java - GUI 组件未在卡片布局中的 JPanel 内垂直对齐
- c++ - 子类析构函数没有被调用
- c# - 为什么我应该在调用 ThrowIfCancellationRequested() 之前检查 IsCancellationRequested
- apache-spark - 使用pyspark检查dbfs中镶木地板长度的最佳方法?
- flutter - 时区颤动
- python - 在全局和局部参数上优化向量函数