zoukankan      html  css  js  c++  java
  • 【面试题003】c数组做为参数退化的问题,二维数组中的查找

    【面试题003】c数组做为参数退化的问题,二维数组中的查找 

    一,c数组做为参数退化的问题

    1.c/c++没有记录数组的大小,因此用指针访问数组中的元素的时候,我们要确保没有超过数组的边界,

    通过下面的程序了解数组与指针的区别。

    array.c:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
     
    #include <stdio.h>
    #include <string.h>

    int GetSize(int data[])
    {
        return sizeof(data);
    }

    int main()
    {
        int data1[] = {12345};
        /*data1是一个数组*/
        int size1 = sizeof(data1);

        int *data2 = data1;
        /*data2是一个指针,
        经管他指向了数组data1的第一个数字,
        但他的本质任然是一个指针*/

        int size2 = sizeof(data2);

        /*在C/C++中,
        当数组做为函数的参数进行传递时,
        数组自动退化为同类型的指针*/

        int size3 = GetSize(data1);

        printf("%d, %d, %d ", size1, size2, size3);
        return 0;
    }
    Makefile:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    .PHONY:clean  
    CC=gcc  
    CFLAGS=-Wall -g  
    BIN=test  
    OBJS=array.o  
    LIBS=  
    $(BIN):$(OBJS)  
        $(CC) $(CFLAGS) $^ -o $@ $(LIBS)  
    %.o:%.c  
        $(CC) $(CFLAGS) -c $< -o $@  
    clean:  
        rm -f *.o $(BIN) 
     

    结果:

    20, 4, 4

     

    二,二维数组中的查找

    a < 0; a = 0 ; a > 0;这个是微积分基本定理;这个很重要!!!

    二维数组,每行每列都是递增排序,给你个数字,判断这个数字是不是这个二维数组当中的。

     

    与数组的右上角的数字进行比较,如果大于这个右上角的数字,剔除这一行;如果小于这个右上角的数字,剔除这一列;

    这样子每一次比较范围就减少了一行或者一列,知道找到最终的位置或者遍历结束没有找到这个数字;

    其实我们也可以选取左下角的那个数字做为比较的“轴”;

    但是不能够选择左上角和右下角,这两个位置不能够每次遍历消除一行或者一列;

     

    DouArr.cpp:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
     
    #include <iostream>
    #include <stdio.h>

    using namespace std;

    /*bool是标准C++数据类型,可取值true和false。单独占一个字节,*/
    bool Find(int *matrix, int rows, int columns, int number)
    {
        bool found = false;

        if(matrix != NULL && rows > 0 && columns > 0)
        {
            /*初始化第一次右上角的坐标位置--记得在循环中更新这两个坐标*/
            int row = 0;
            int column = columns - 1;

            /*循环的过程中row区域rows,column趋于0*/
            while(row < rows && column >= 0)
            {

                /*C/C++二维数组是可以这么搞的,
                因为二维数组在内存中占据连续的内存空间,
                千万不要用java这么搞*/

                /*在内存中从上倒下存储各行元素,
                在同一行中按照从左到右的顺序存储。
                根据行号和列好计算出相对于数组首地址的偏移量,
                从而找到对应元素*/

                if (matrix[row * columns + column] == number)
                {
                    found = true;
                    break;
                }
                else if(matrix[row * columns + column] > number)
                {
                    -- column;
                }
                else
                {
                    ++ row;
                }
            }
        }

        return found;
    }


    //  1   2   8   9
    //  2   4   9   12
    //  4   7   10  13
    //  6   8   11  15
    // 要查找的数在数组中
    int main()
    {
        int matrix[][4] =
        {
            {1289},
            {24912},
            {471013},
            {681115}
        };
        if (Find((int *)matrix, 447))
        {
            cout << "Find it" << endl;
        }
        else
        {
            cout << "No find it!" << endl;
        }

        return 0;
    }
    Makefile:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    .PHONY:clean  
    CPP=g++  
    CFLAGS=-Wall -g  
    BIN=test  
    OBJS=DouArr.o  
    LIBS=  
    $(BIN):$(OBJS)  
        $(CPP) $(CFLAGS) $^ -o $@ $(LIBS)  
    %.o:%.cpp  
        $(CPP) $(CFLAGS) -c $< -o $@  
    clean:  
        rm -f *.o $(BIN)  


    运行结果:

     Find it!

  • 相关阅读:
    C++学生成绩管理系统
    蓝桥杯算法训练 最大最小公倍数
    蓝桥杯基础练习 完美的代价
    vim编辑器的使用技巧
    C语言中static关键字的用法
    在linux环境下编译运行OpenCV程序的两种方法
    Linux中gcc编译器的用法
    浅谈Java中的hashcode方法
    读CopyOnWriteArrayList有感
    徐汉彬:Web系统大规模并发——电商秒杀与抢购(技术实现)
  • 原文地址:https://www.cnblogs.com/codemylife/p/3658207.html
Copyright © 2011-2022 走看看