[英]equal jump between numbers in two arrays
我想比较两个 arrays。 其中一个是另一个的子集。 我希望我的 function 返回另一个数组中第一个子集数组的数字之间的最小且相等的间隙。
例如,如果我有
arr1 = 2,1,4,2,8,3
sub= 1,2,3
我希望我的 function 返回 1,因为所有这些数字之间的最小差距是 1。
arr1 = 2,1,5,2,1,2,3
sub= 1,2,3
我希望我的 function 返回 0,因为 arr1 中 1、2、3 之间的最小间隙为 0
这是我正在尝试做的代码:我的代码总是返回 0 你能帮我理解为什么,我该如何解决这个问题。
int gap(int* arr, int* sub, int sizeArr, int sizeSub)
{
int index = 0; int gap = 0; bool flag = true;
int i = -1;
for (int jump = 1; jump < sizeArr / sizeSub; jump++)
{
index = 0;
for (i = i +1; i < sizeArr; i++)
{
if (sub[index] == arr[i])
{
for (int j = i + jump, index = 1; j < sizeArr; j = j + jump, index++)
{
if (arr[j] != sub[index]) { flag = false; break; }
else if (arr[j] == sub[index] && index == sizeSub) { flag = true; break; }
}
}
if (!flag) { break; }
else { gap = jump; break; }
}
}
return gap;
}
您最初将 gap 设为0
但我认为更适合不存储gap
并从0
开始迭代jump
。 并在你发现它适合后立即返回跳跃。
我也认为以你这样的方式存储索引是个坏主意,因为你的代码返回错误的答案
int a[] = { 2,1,4,4,2,8,5,3 };
int s[] = { 1,2,3 };
我认为你应该尽快声明变量,否则会有不良的副作用。
所以你的代码可以重写为
int gap(int *arr, int *sub, int sizeArr, int sizeSub)
{
for (int jump = 0; 1 + (jump + 1) * (sizeSub - 1) <= sizeArr; jump++) {
for (int start_index = 0; start_index + (jump + 1) * (sizeSub - 1) < sizeArr; start_index++) {
bool flag = true;
for (int index = 0; index < sizeSub; ++index) {
if (arr[start_index + index * (jump + 1)] != sub[index]) {
flag = false;
break;
}
}
if (flag) {
return jump;
}
}
}
return -1; //or some value that indicate that there is no answer
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.