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

未通过HackerRank中所有测试用例的数组中的最大差异

鲍钊
2023-03-14

我申请了一份工作,未来的雇主给我发了以下黑客问题,在公共场所找不到。

给出一个整数数组,计算所有可能对的任何项和任何索引较低的较小项之间的最大差值。换句话说,对于数组arr,查找所有i,j的arr[j]-arr[i]的最大值,其中0

例如,给定arr=[1,2,6,4],首先将2与其左侧的元素进行比较。1较小,因此计算差值2-1=1。6大于2和1,因此计算差值6-2=46-1=5。最后一个元素4只大于2和1,差别是4-2=24-1=3。最大的差异是6-1=5

功能描述

完成函数maxDifference。函数必须返回一个整数,该整数表示arr中的最大差值。

maxDifference具有以下参数:arr[arr[0],arr[1],。。。arr[n-1]:整数数组。

约束条件

  • 一,

解决方案

fun maxDifference(arr: Array<Int>): Int {

    var min: Pair<Int, Int> = Pair(0, 0)
    var max: Pair<Int, Int> = Pair(0, 0)
    var result = -1

    for(i in 0 until arr.size) {
        when {
            i == 0 -> {
                min = Pair(i, arr[i])
                max = Pair(i, arr[i])
            }
            min.second > arr[i] -> min = Pair(i, arr[i])
            max.second < arr[i] -> max = Pair(i, arr[i])
        }

        if(max.first > min.first && max.second > min.second)
            result = kotlin.math.max(result, max.second - min.second)
    }

    return result
}

问题所在

由于某种原因,上述解决方案无法通过HackerRank中的所有测试用例。不幸的是,发送此测试的雇主不愿意透露测试用例,以了解问题所在。代码本身工作正常。

测试用例

  1. [2,3,10,2,4,8,1]-(预期结果为8)
  2. [7,9,5,6,3,2]-(预期结果为2)
  3. [3]-(预期结果为-1)
  4. [-3,-2]-(预期结果为1)

共有3个答案

岳曦
2023-03-14

试试这个:

fun maxiDiff(numbers:List<Int>):Int{
    
    val numbersSorted = numbers.distinct().sorted()
    
    if(numbersSorted.isEmpty() || numbersSorted.size == 1)return -1
    
    val gaps = numbersSorted.zipWithNext{a,b -> Math.abs(b-a)}
    
    return gaps.max() ?: -1
}
白宏义
2023-03-14

您的初始值是错误的-您应该将最小值/最大值硬编码为±106
而且最小值/最大值不是没有用吗?您不应该使用最小/最大差异吗
这里的示例应该是4-3=1,但找不到(假设您的代码的工作方式与此完全相同):

js prettyprint-override">function maxDifference(arr) {
    var min = [0,0];
    var max = [0,0];
    var result = -1

    for(var i in arr) {
        if(i == 0) {
            min = [i, arr[i]];
            max = [i, arr[i]];
        }
        if(min[1] > arr[i]) min = [i, arr[i]];
        if(max[1] < arr[i]) max = [i, arr[i]];

        if(max[0] > min[0] && max[1] > min[1])
            result = Math.max(result, max[1] - min[1])
    }

    return result
}
var a = prompt("Enter data:","9,7,5,6,3,4");
console.log("Array:",a);
console.log(maxDifference(a.split(',')));
孟成化
2023-03-14

正如@Tom在这个关于测试失败的回答中已经提到的,我觉得你的解决方案相当复杂,因为你试图维护一对。我将其简化如下(不是kotlin开发人员,所以下面是Javascript):

var arr = [1, 2, 6, 4];

var min = arr[0];
var diff = -1;

for (var i = 1; i < arr.length; ++i) {
  if (arr[i] > min) diff = Math.max(arr[i] - min, diff);
  min = Math.min(min, arr[i]);
}

console.log(diff);
 类似资料:
  • 给定一个大小为N的数组A,您需要找到它的最大值、第二最大值和第三最大值元素。尝试在每个测试用例中以O(N)求解它 输入 输入的第一行包含测试用例的数量T。 对于每个测试用例,输入的第一行包含一个整数N,表示数组A中的元素数。下一行包含A的N个(空格分隔)元素。 在我的代码中,除了一个显示MLE的测试用例之外,每个测试用例都通过了。

  • 给定一个数组,编写一个程序以在大小的所有子数组中找到最大 gcd 我的代码: 它是O(N^2),还能再优化吗?

  • 求给定数组的连续子集的最大可能差之和。 我们得到一个由n个非负整数(允许重复元素)组成的数组arr[],求出给定数组中相邻子集的最大差之和。 假设max(s)表示任何子集's'中的最大值,而min(s)表示集合's'中的最小值。我们需要为所有可能的子集找到max(s)-min(s)的总和。 解释: 约束条件: 这是从此处获取的代码,但此代码检查所有可能的子集,而不是连续的子集: 那么如何只得到连续

  • 问题内容: 基本上我有一个类似于以下问题: 有一个以2D正方形阵列表示的草莓植物花园。每棵植物(每个元素)都有许多草莓。您从数组的左上角开始,并且只能向右或向下移动。我需要设计一种递归方法来计算通过花园的路径,然后输出产量最高的草莓。 我认为我对非常简单的递归问题有所了解,但是这个问题已经超出了我的范围。我真的不确定创建递归方法的起点或终点。 非常感谢与代码相关的任何帮助或帮助我理解此问题背后的概

  • 泰森已经为贝布莱德世界锦标赛做好了准备。锦标赛以团队为基础,每个团队可以有N名成员。一个玩家只能与一个玩家战斗。G-Revolution团队非常兴奋,因为他们已经进行了大量练习。G-Revolution团队的负责人肯尼创建了一个数据库,在那里他有关于其他团队成员和自己团队成员力量的数据。比赛将在一段时间后开始,肯尼在比赛前搬到自助餐厅吃点心。 G革命团队将在一段时间内战斗,当有人从自助餐厅绑架肯尼

  • 您将获得一个包含n个元素的数组:<代码>d[0],d[1]。。。,d【n-1】。计算所有相邻子数组的最大差值之和。 形式上:S=sum{max{d[l,..., r]}-min{d[l,..., r}},Δ0 输入: 输出: 解释: l=0;r=1;数组:[1,3]和=最大值([1,3])-最小值([1,3])=3-1=2 l=0;r=2;数组:[1,3,2]和=最大值([1,3,2])-最小值(