我申请了一份工作,未来的雇主给我发了以下黑客问题,在公共场所找不到。
给出一个整数数组,计算所有可能对的任何项和任何索引较低的较小项之间的最大差值。换句话说,对于数组arr
,查找所有i,j的arr[j]-arr[i]
的最大值,其中0
例如,给定
arr=[1,2,6,4]
,首先将2与其左侧的元素进行比较。1较小,因此计算差值2-1=1
。6大于2和1,因此计算差值6-2=4
和6-1=5
。最后一个元素4只大于2和1,差别是4-2=2
和4-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中的所有测试用例。不幸的是,发送此测试的雇主不愿意透露测试用例,以了解问题所在。代码本身工作正常。
测试用例
[2,3,10,2,4,8,1]-(预期结果为8)
- [7,9,5,6,3,2]-(预期结果为2)
- [3]-(预期结果为-1)
- [-3,-2]-(预期结果为1)
试试这个:
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
}
您的初始值是错误的-您应该将最小值/最大值硬编码为±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(',')));
正如@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])-最小值(