我正在try 构建一个使用二进制搜索在已排序的2D数组中查找数字的函数,我得到了这个无法更改的函数原型:

int findNum(int array[N][M], int num,unsigned int* row, unsigned int* col);

我试过这个:

int findNum(int array[N][M], int num,unsigned int* row, unsigned int* col){
    int low = 0 , mid , high = N*M - 1;

    while (low <= high)
    {
        mid = (low + high)/2;
        row = (mid / N);
        col = (mid % M);

        if (num < *(array + row + col)){
            high = mid - 1;
        }
        else if (num > *(array + row + col)){
            low = mid + 1;
        }
        else{
            return 1;
        }
    }
     
    return 0;
}

显然这是错误的,因为指针加指针是不允许的(*(array + row + col)).我不能更改函数原型,所以我必须使用行/列指针.我认为我使用row = (mid / N);col = (mid % M);的方式也是错误的,因为它们一边是指针,另一边只是整数.

我怎么才能解决这个问题呢?

推荐答案

rowcol看起来像指向整数的指针,如果函数找到值,则应该用要搜索的值的位置填充整数.

类似于:

#include <stdio.h>

#define N 3
#define M 3

int findNum(int array[N][M], int num, unsigned int *row, unsigned int *col)
{
    int low = 0, mid, high = N * M - 1;

    while (low <= high) {
        mid = (low + high) / 2;
        *row = (mid / N);
        *col = (mid % M);

        if (num < array[*row][*col]) {
            high = mid - 1;
        } else if (num > array[*row][*col]) {
            low = mid + 1;
        } else {
            return 1;
        }
    }

    return 0;
}

int main(void)
{
    int data[N][M] = {
        { 1, 2, 3 },
        { 4, 5, 6 },
        { 7, 8, 9 }
    };

    unsigned int r, c;

    if (findNum(data, 4, &r, &c)) {
        printf("R: %u C: %u\n", r, c);
    } else
        puts("Not found.");
}

输出:

R: 1 C: 0

C++相关问答推荐

海湾合作委员会是否保证大小匹配的访问?

POSIX文件描述符位置

C指针地址和转换

为什么在Linux(特别是Ubuntu 20.04LTS)上,POSIX共享内存对象在重启后仍然存在,然后突然变成了根用户?

*p[num]和(*p)num的区别

GCC预处理宏和#杂注GCC展开

识别和处理c中整数溢出的最佳方法?

如何将字符串传递给函数并返回在C中更改的相同字符串?

如何捕捉只有换行符或空格字符缓冲区的边缘大小写

为什么指针运算会产生错误的结果?

用C++从外部ELF符号读取值

I2C外设在单次交易后出现故障

我正在try 将QSORT算法实现为C++中的泛型函数

如何使用空元素块声明指针数组

使用mmap为N整数分配内存

在Ubuntu上使用库部署C程序的最佳实践

在分配内存后使用指针是未定义的行为吗?

共享内存未授予父进程权限

在列表中查找素数

窗口消息处理函数以某种方式更改了应保持不变的 int 变量的值