簡體   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