给定一个数组,该数组包含一对连续整数与上下限之间的差,找出满足这些条件的可能数组数。
example:
array = [-2, -1, -2, 5]
lowe limit = 3;
upper limit = 10
Ans:
3
explanation:
possible arrays are :
[3,5,6,8,3] => here each element is within limits and difference between adjacent elements is [-2,-1,-2,5]
[4,6,7,9,4] => same as above
[5,7,8,10,5] => same as above
这是我的程序,但这不是我正在使用的正确方法,因为几天前在hackerrank的几个测试案例中,该程序都失败了:
public static int process(List<Integer> arr, int lower, int higher) {
int max = Integer.MIN_VALUE;
int n = lower;
for (int i = 0; i < arr.size(); i++) {
int k = arr.get(i);
int k1 = n - k;
if (k1 > higher || k1 < lower) {
return 0;
}
n = k1;
max = Math.max(max, n);
}
max = higher - max + 1;
return max;
}
这项任务的正确方法是什么?
public static void main(String[] args) {
// TODO Auto-generated method stub
List<Integer> baseArray = new ArrayList<>();
baseArray.add(-2);
baseArray.add(-1);
baseArray.add(-2);
baseArray.add(5);
int lower = 3;
int upper = 10;
int arrayMatches = 0;
for(int i=lower; i<=upper; i++) {
boolean match = false;
int[] array = new int[baseArray.size() + 1];
int matchCount = 0;
for(int j = 0; j<=array.length-1; j++) {
if(j == 0) {
array[j] = i;
continue;
}
int matchValue = baseArray.get(j -1);
for(int b=lower; b<=upper;b++) {
if(array[j-1] - b == matchValue) {
matchCount++;
array[j]=b;
}
}
}
if(matchCount == baseArray.size()) {
arrayMatches++;
}
}
System.out.println(arrayMatches);
}
这是Python解决方案:
def countAnalogousArrays(consecutiveDifference , lowerBound , upperBound):
maxdiff = float('-inf')
mindiff = float('inf')
runningsum = 0
if len(consecutiveDifference) == 0:
return 0
if upperBound < lowerBound :
return 0
for diff in consecutiveDifference:
runningsum+=diff
if runningsum > maxdiff:
maxdiff = runningsum
if runningsum < mindiff:
mindiff = runningsum
maxvalidupperbound = upperBound + mindiff if upperBound+mindiff < upperBound else upperBound
minvalidlowerbound = lowerBound + maxdiff if lowerBound + maxdiff > lowerBound else lowerBound
if maxvalidupperbound >= minvalidlowerbound:
return maxvalidupperbound - minvalidlowerbound + 1
else:
return 0
在我看来你的逻辑是正确的。你能给出一些失败的测试用例吗?
我认为你可以把事情简化一点,因为你选择的变量名称和代码的结构让事情变得更难审查:
int min = 0;
int max = 0;
int current = 0;
for (int val: arr) {
current += val;
min = Math.min(min, current);
max = Math.max(max, current);
}
return Math.max(0, (higher - lower) - (max - min) + 1);
我的代码中的一个不同之处是,我在遍历数组时只计算第一个数字的差值,在计算出答案之前不使用实际范围。这使得算法更易于遵循(IMO)。
问题内容: 我有以下两个数组。我想要这两个数组之间的区别。也就是说,如何找到两个数组都不存在的值? 问题答案: 注意: 这个答案将返回的值是不存在的,它不会返回值不在。
这些声明有什么不同? 每种情况下的内存分配情况如何?
可能重复: 原始数组与ArrayList 在java中,列表和数组有什么区别?或数组和矢量之间的区别!
问题内容: 我有计算纯python中相邻元素之间差异的算法: 有什么办法可以用Numpy重写此功能? 问题答案: 有方法: 退货
问题内容: 在查看源文件时,我看到了两种数组初始化方式。我想知道两者之间是否有区别 和 ? 问题答案: 实际上没有区别。它 在java数组声明中。 第一种类型声明不那么令人困惑,至少对我而言:)。 注意: 我不确定为什么在声明时将长度设为 零 。 如果可能的话,请访问https://stackoverflow.com/a/19558179/1927832,以获取相对于其他方面的某些优势。
给定一个无序整数列表,以这种方式打印两个总计为的整数(int 1小于或等于int 2,它们之间用空格隔开)。假设整数列表中总是有的解。int1和int2必须是正整数。 如果有多个解决方案,请打印差异最小的整数对。 例子: 这是我的代码,但是根据我们的编译器(这是我们班的一个练习),我对隐藏的测试用例有错误的输出。 更新:代码工作!