繁体   English   中英

两个 arrays 中的数字之间的相等跳转

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM