【问题标题】:Interleaving array in CC中的交错数组
【发布时间】:2018-10-06 01:11:36
【问题描述】:

我之前发布过,但我没有正确格式化或添加我的代码。假设我有一个 int 数组 x = [1,2,3]。给定一个值 i,我想创建一个数组 x^i,这样,如果 i = 3,数组 x^i = [1,1,1,2,2,2,3,3,3]。如果 i = 5,则数组 x^i = [1,1,1,1,1,2,2,2,2,2,3,3,3,3,3,4,4,4,4,4 ,5,5,5,5,5]。我正在为此动态分配内存。

但是,我的 i = 3 代码正在创建一个数组 = [1,2,3,1,2,3,1,2,3]。我尝试了很多不同的东西,我得到了类似 [1,1,1,1,1,1,1,1,1] 或 [3,3,3,3,3,3,3,3, 3] 但从来没有正确的答案。

这是我的代码:

void binary_search(int size_a, int * A, int size_x, int *X, int max_i, int min_i){

    int i, j, k, count = 0, max_repeat = 0;

    while(min_i <= max_i){

    int repeats = (max_i + min_i)/2;

    int * temp = realloc(X, size_x * sizeof(int) * repeats);
    X = temp;


    for(k = 0; k < size_x; ++k){
    int idx = size_x - k -1;
    temp = &X[idx];
        for(j = 0; j < repeats; ++j){
            X[idx * repeats + j] = *temp;
        }
    }

    printf("New X: ");
        for(i = 0; i < size_x * repeats; i++){
            printf("%d ", X[i]);
        }

    int count = 0;
    for(i = 0; i < size_x * repeats; i++){
        for(j = 0; j < size_a; j++){
            if(A[j] == X[i]){
                count++;
                i++;
            }
        }
    }

    if (count == size_x * repeats){
        printf("Low: %d Mid %d High % d Passes\n", min_i, repeats, max_i);
        min_i = repeats + 1;
    }
    else
        printf("Low: %d Mid %d High % d Fails\n", min_i, repeats, max_i);
        max_i = repeats - 1;
    }

}

变量repeats表示x^i中的值i。

输出是这样的:

Old X: 1 2 3 

New X: 1 1 1 2 2 2 3 3 3 Low: 0 Mid 3 High  6 Fails

New X: 1 1 1 Low: 0 Mid 1 High  2 Fails

New X: Low: 0 Mid 0 High  0 Fails

第一次迭代是正确的,但是第二次迭代不应该是[1,1,1],应该是[1,2,3]。

我哪里错了?

【问题讨论】:

  • 为什么要使用 max_imin_i 参数。只需传递max = max_i - min_i 并使用&amp;X[min_i] 传递X
  • 这是一个二进制搜索,我必须将 X 与另一个数组 A 进行比较。当我能弄清楚如何正确填充 X 时,我会担心修复它。
  • 从后面创建即可。从最后一个数字开始,而不是从第一个数字开始。首先将3复制三遍。

标签: c arrays interleave


【解决方案1】:

给你:

int misleading_function_names_is_bad_practice(size_t xsize, int x[xsize], size_t i)
{
    void * const tmp = realloc(x, xsize * sizeof(*x) * i);
    if (tmp == NULL) {
       return -__LINE__;
    }
     x = tmp;

     for (size_t k = 0; k < xsize; ++k) {
         // index of the last original digit counting down
         const size_t idx = xsize - k - 1;
         const int tmp = x[idx];
         for (size_t l = 0; l < i; ++l) {
              // fill from the back
              x[idx * i + l] = tmp;
         }
      }

      return 0;
}

onlinegdb 提供实时示例。

【讨论】:

  • 这有点奏效。它适用于我的二进制搜索的第一次迭代,但不适用于第二次。我正在编辑我的帖子,向您展示我所做的更改。
  • 已编辑原始帖子。你能看一下吗?
  • 这仅对扩大阵列有效。为了缩小规模,您应该从前面处理阵列。我把它留给你作为训练练习。您还发布了一些数据,一些 x 值,作为预期的输出,但没有输入值,所以我只能推断它们。我不知道,你的意思是在第三行运行i = -3size_t 是无符号的,所以你需要使用另一种数据类型。如果我能给你一个建议,请退后一步,给自己准备一张纸和笔,重新思考你的设计。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-03-21
  • 2012-02-18
  • 2014-03-26
  • 2021-08-02
  • 2019-03-25
  • 2013-08-12
  • 1970-01-01
相关资源
最近更新 更多