【面试题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[] = {1, 2, 3, 4, 5};
    /*data1是一个数组*/
    int size1 = sizeof(data1);

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

/*在C/C++中,
    当数组做为函数的参数进行传递时,
    数组自动退化为同类型的指针*/
    int size3 = GetSize(data1);

printf("%d, %d, %d\n", 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] =
    {
        {1, 2, 8, 9},
        {2, 4, 9, 12},
        {4, 7, 10, 13},
        {6, 8, 11, 15}
    };
    if (Find((int *)matrix, 4, 4, 7))
    {
        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!

【面试题003】c数组做为参数退化的问题,二维数组中的查找的更多相关文章

  1. C语言 数组做函数参数退化为指针的技术推演

    //数组做函数参数退化为指针的技术推演 #include<stdio.h> #include<stdlib.h> #include<string.h> //一维数组 ...

  2. Arrays类的运用,二分法,数组的复制,命令行参数的运用,二维数组,Object,equals

    /*Arrays jdk中为了便于开发,给开发者提供了Arrays类, 其中包含了很多数组的常用操作.例如快速输出.排序.查找等.*/ import java.util.Arrays; public ...

  3. java se系列(四) 函数、数组、排序算法、二分法、二维数组

    1 函数 1.1  数的概述 发现不断进行加法运算,为了提高代码的复用性,就把该功能独立封装成一段独立的小程序,当下次需要执行加法运算的时候,就可以直接调用这个段小程序即可,那么这种封装形形式的具体表 ...

  4. php 把一个数组分成有n个元素的二维数组的算法

    一.第一种解法 <?php //把一个数组分成几个数组 //$arr 是数组 //$num 是数组的个数 function partition($arr,$num){ //数组的个数 $list ...

  5. js 把x,y轴两个数组变成[[x,y],[x,y]]的二维数组

    例如有X轴数组xarr=[2006,2007,2008],Y轴数组yarr=[12,15,18],代码如下: //调用 mergexy([2006,2007,2008],[12,15,18]); // ...

  6. ***php解析JSON二维数组字符串(json_decode函数第二个参数True和False的区别)

    客户端的请求体中的数据:[{"msg_id": 1, "msg_status": "HAS_READ" }, { "msg_id& ...

  7. 前端常见算法面试题之 - 二维数组中的查找[JavaScript解法]

    --------------------- 作者:吴潇雄 来源:CSDN 原文:https://blog.csdn.net/weixin_43439741/article/details/835118 ...

  8. C语言二维数组作为函数参数

    设有整型二维数组a[3][4]如下:0   1   2   34   5   6   78   9  10  11 它的定义为:    int a[3][4]={{0,1,2,3},{4,5,6,7} ...

  9. js将一个具有相同键值对的一维数组转换成二维数组

    这两天,一个前端朋友在面试的笔试过程中遇到了一道类似于"用js实现将一个具有相同code值的一维数组转换成相同code值在一起的二维数组"的题目.他面试过后,把这个问题抛给了我,问 ...

随机推荐

  1. SCP服务实现Linux交互

    SCP服务实现Linux交互 在实际工作中,我们可以使用scp服务器进行Linux与Linux之间的信息交互. 基本指令: scp         本地文件     远程文件 scp          ...

  2. java web 实现验证码

    验证码的作用:通常的登录或者注册系统时,都会要求用户输入验证码,以此区别用户行为和计算机程序行为,目的是有人防止恶意注册.暴力破解密码等. 实现验证码的思路:用 server 实现随机生成数字和字母组 ...

  3. 已有数据表的Mysql字符编码修改

    Mysql字符集修改应该如何实现呢?下面就为您详细介绍已用数据表的Mysql字符集修改方法,希望对您学习Mysql字符集方面能有所启迪. 环境:在应用开始阶段没有正确的设置字符集,在运行一段时间以后才 ...

  4. Spark RDD整理

    参考资料: Spark和RDD模型研究:http://itindex.net/detail/51871-spark-rdd-模型 理解Spark的核心RDD:http://www.infoq.com/ ...

  5. 比较不错的一个ios找茬游戏源码

    找茬游戏源码 ,这个是一款非常不错的ios找茬游戏源码,该游戏的兼容性非常好的,并且还可以支持ipad和iphone,UI界面设计得也很漂亮,游戏源码真的是一款非常完美,而且又很完整的一款休闲类的游戏 ...

  6. PHP 判断客户端请求是 Android 还是 IOS

    <?php if(strpos($_SERVER['HTTP_USER_AGENT'], 'iPhone')||strpos($_SERVER['HTTP_USER_AGENT'], 'iPad ...

  7. line-height属性使文字垂直居中原理

    原理:line-height与font-size的计算之差(在CSS中成为“行间距”)分为两半,分别加到一个文本内容的顶部和底部,这样就使得文字垂直居中了.

  8. WPF 气泡尖角在左边、下面、右边、上面

    由于项目需要,在弄一个气泡提示框,根据网上资料,使用Path可以将气泡画出来,下面是我画出来的. 1.气泡尖角在左边的: <Path Stroke="Black" Strok ...

  9. 在 SQL Server 中的网络数据库文件的支持说明

    其实就是一个学员问SQL Server 是否能存放的于NAS(UAC 的路径下). 官方的回答简略版本为:可以,需要满足一些强制性的硬件要求.但需要考虑一系列的性能的问题. http://suppor ...

  10. MyEclipse管理部署Maven项目 供调试

    今天对Maven的一个项目弄到头大,用MyEclipse10.x做了半天都没有部署成功. 后来发现用maven自己的maven4myelipse插件配置一下Goals:tomcat:run就好了,其他 ...