当前位置: 首页 > 知识库问答 >
问题:

给定一个相邻数字之间存在差异的数组,找到原始数组的可能性

董法
2023-03-14

给定一个数组,该数组包含一对连续整数与上下限之间的差,找出满足这些条件的可能数组数。

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;
}

这项任务的正确方法是什么?

共有3个答案

卫阳炎
2023-03-14
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);

}
太叔航
2023-03-14

这是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
冯星阑
2023-03-14

在我看来你的逻辑是正确的。你能给出一些失败的测试用例吗?

我认为你可以把事情简化一点,因为你选择的变量名称和代码的结构让事情变得更难审查:

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必须是正整数。 如果有多个解决方案,请打印差异最小的整数对。 例子: 这是我的代码,但是根据我们的编译器(这是我们班的一个练习),我对隐藏的测试用例有错误的输出。 更新:代码工作!