我在解决 HackerRank - "Pairs" 问题(评级中等)时的错误在哪里?
Where is my mistake in solution of HackerRank - "Pairs" problem (rated medium)?
给定一个整数数组和一个目标值,确定差值等于目标值的数组元素对的数量。
这是问题的 link:
https://www.hackerrank.com/challenges/pairs/problem
我的算法应该执行以下操作:
- 对数组进行排序
- 比较2个邻居号(i, i+1):
如果它们之间的差异等于给定的数字 k,则递增
结果
如果差异小于给定数,则比较 i+1
使用 0,...,i-1 个元素尝试在其中找到可能的对。
如果差异大于给定的数字 k,则增加 i 并对下一对执行相同的操作。
我认为算法是正确的,我在实现中找不到错误。我的代码通过了主要测试用例并通过了 5/18 个附加测试用例。请帮我找出错误。
这是我的代码:
public static int pairs(int k, List<int> arr)
{
arr.Sort();
var result = 0;
for (var i = 0; i < arr.Count - 1; ++i){
var diff = arr[i + 1] - arr[i];
if (diff > k) continue;
else if (diff == k) ++result;
else {
result = CompareWithPreviousValues(arr, k, i + 1, result);
}
}
return result;
}
private static int CompareWithPreviousValues(List<int> arr, int k, int indexOfElementToCompare, int result) {
var j = 2;
for (var i = indexOfElementToCompare; i - j >= 0; --i){
var diff = arr[i] - arr[i - j];
if (diff < k) ++j;
else if (diff == k){
++result;
return result;
}
else return result;
}
return result;
}
在 post 提出问题之前,我再次检查了代码并发现了我犯的错误..但是由于在 Whosebug 中没有讨论这个问题,一些人可能会发现错误在代码中,我决定 post 无论如何。我花时间填写了问题 :D
所以这个错误..当然是一个小错误,但是一个不愉快的错误。
DISCLAMER 对于那些想找出错误的人,我建议不要继续阅读下面的内容,因为有固定代码:D
错误在“CompareWithPreviousValues”方法的for循环中。
每次迭代后,由于某种原因我被减少了。我可能机械地写了 i,因为大多数循环都使用“i”。
所以这是该方法的正确版本:
private static int CompareWithPreviousValues(List<int> arr, int k, int n, int result) {
var j = 2;
for (var i = n; i - j >= 0; ++j){
var diff = arr[i] - arr[i - j];
if (diff < k) continue;
else if (diff == k){
++result;
return result;
}
else return result;
}
return result;
}
给定一个整数数组和一个目标值,确定差值等于目标值的数组元素对的数量。
这是问题的 link: https://www.hackerrank.com/challenges/pairs/problem
我的算法应该执行以下操作:
- 对数组进行排序
- 比较2个邻居号(i, i+1): 如果它们之间的差异等于给定的数字 k,则递增 结果 如果差异小于给定数,则比较 i+1 使用 0,...,i-1 个元素尝试在其中找到可能的对。 如果差异大于给定的数字 k,则增加 i 并对下一对执行相同的操作。
我认为算法是正确的,我在实现中找不到错误。我的代码通过了主要测试用例并通过了 5/18 个附加测试用例。请帮我找出错误。
这是我的代码:
public static int pairs(int k, List<int> arr)
{
arr.Sort();
var result = 0;
for (var i = 0; i < arr.Count - 1; ++i){
var diff = arr[i + 1] - arr[i];
if (diff > k) continue;
else if (diff == k) ++result;
else {
result = CompareWithPreviousValues(arr, k, i + 1, result);
}
}
return result;
}
private static int CompareWithPreviousValues(List<int> arr, int k, int indexOfElementToCompare, int result) {
var j = 2;
for (var i = indexOfElementToCompare; i - j >= 0; --i){
var diff = arr[i] - arr[i - j];
if (diff < k) ++j;
else if (diff == k){
++result;
return result;
}
else return result;
}
return result;
}
在 post 提出问题之前,我再次检查了代码并发现了我犯的错误..但是由于在 Whosebug 中没有讨论这个问题,一些人可能会发现错误在代码中,我决定 post 无论如何。我花时间填写了问题 :D
所以这个错误..当然是一个小错误,但是一个不愉快的错误。 DISCLAMER 对于那些想找出错误的人,我建议不要继续阅读下面的内容,因为有固定代码:D
错误在“CompareWithPreviousValues”方法的for循环中。 每次迭代后,由于某种原因我被减少了。我可能机械地写了 i,因为大多数循环都使用“i”。 所以这是该方法的正确版本:
private static int CompareWithPreviousValues(List<int> arr, int k, int n, int result) {
var j = 2;
for (var i = n; i - j >= 0; ++j){
var diff = arr[i] - arr[i - j];
if (diff < k) continue;
else if (diff == k){
++result;
return result;
}
else return result;
}
return result;
}