剑指offer阅读有感

原创 2013年12月01日 22:33:06
/*二维数组中的查找
 * 在一个二维数组中,每一行都按照从左到右递增的顺序排序;
 * 每一列都按照从上到下递增的顺序排序。需要一个函数,输入
 * 这样一个二维数组中的一个整数 ,判断是否为此数组的元素;
 *
 *变量的定义:不再多说;
 *
 * 首先解决此问题前我需要明白二维数组需要手工定义的变量
 * 如行、列,还有输入的数以及一个标记二位数的地址变量
 * 以及定义一个一维数组存储指定元素的下标;
 *
 *
 * 编写测试程序,测试各种情况增强代码的鲁棒性(robust);
 * 这里测试程序以模块化编程的思想写成函数的形式;Test()
 */

#include <stdio.h>
#include <stdbool.h>

//bool Find (int * matrix, int *index, int rows, int columns, int number){
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; //数组元素的小标从0开始,所以减掉1;

                while(row < rows  && column >= 0){
                        if(number == matrix[row * columns + column]){   //右上角数字
                                Found = true;
                        //      index[0] = row;
                        //      index[1] = column;
                                break;  //我在使用break的时候犯了一个错误就是忘记了上面的while循环,
                                                //break只能用在循环语句中跳到外层循环;
                        }
                        else if(matrix[row*columns + column] > number){
                                --column;
                        }
                        else{
                                ++row;
                        }
                }
        }
        return Found;
}

void Test(char *Testname, int *matrix, int rows, int columns, int number, bool expected){
        if(Testname)
                printf("%s start: \n",Testname);
        bool result = Find(matrix, rows, columns, number);
        printf("result val is:%d\n",result);
        printf("expected val is:%d\n",expected);
        if(result )
                printf("Congratulations u find it !!!\n");
        else
                printf("There is some trouble ...!!\n");
}

/*The first test*/
//  1   2   8   9
//  2   4   9   12
//  4   7   10  13
//  6   8   11  15
// 要查找的数在数组中
void Test1 (void){
        int matrix[][4] = {{1, 2, 8, 9}, {2, 4, 9, 12}, {4, 7, 10, 13}, {6, 8, 11, 15}};
        Test("Test1", (int*)matrix, 4, 4, 7, true);
}

/*The second Test*/
//  1   2   8   9
//  2   4   9   12
//  4   7   10  13
//  6   8   11  15
// 要查找的数不在数组中
void Test2 (void){
        int matrix[][4] = {{1, 2, 8, 9}, {2, 4, 9, 12}, {4, 7, 10, 13}, {6, 8, 11, 15}};
        Test("Test2",(int *) matrix, 4, 4, 5, false);
}
/*3*/
//  1   2   8   9
//  2   4   9   12
//  4   7   10  13
//  6   8   11  15
// 要查找的数不在数组中

void Test3 (void){
        int matrix[][4] = {{1, 2, 8, 9}, {2, 4, 9, 12}, {4, 7, 10, 13}, {6, 8, 11, 15}};
        Test("Test3", (int*)matrix, 4, 4, 1, true);
}

//  1   2   8   9
//  2   4   9   12
//  4   7   10  13
//  6   8   11  15
// 要查找的数是数组中最大的数字
void Test4()
{
    int matrix[][4] = {{1, 2, 8, 9}, {2, 4, 9, 12}, {4, 7, 10, 13}, {6, 8, 11, 15}};
    Test("Test4", (int*)matrix, 4, 4, 15, true);
}

//  1   2   8   9
//  2   4   9   12
//  4   7   10  13
//  6   8   11  15
// 要查找的数比数组中最小的数字还小
void Test5()
{
    int matrix[][4] = {{1, 2, 8, 9}, {2, 4, 9, 12}, {4, 7, 10, 13}, {6, 8, 11, 15}};
    Test("Test5", (int*)matrix, 4, 4, 0, false);
}

//  1   2   8   9
//  2   4   9   12
//  4   7   10  13
//  6   8   11  15
// 要查找的数比数组中最大的数字还大
void Test6()
{
    int matrix[][4] = {{1, 2, 8, 9}, {2, 4, 9, 12}, {4, 7, 10, 13}, {6, 8, 11, 15}};
    Test("Test6", (int*)matrix, 4, 4, 16, false);
}

// 鲁棒性测试,输入空指针
void Test7()
{
    Test("Test7", NULL, 0, 0, 16, false);
}
/*这里为测试而用*/
#if 0
int main(int argc, char *argv[]){
        int index[2] = {0};     //数组初始化 ,用来保存符合条件元素的下标;
        int matrix[4][4] = {{1,2,8,9}, {2,4,9,12}, {4,7,10,13}, {6,8,11,15}};
        printf("数组初始化成功、\n");
        bool ret = Find(matrix, index, 4, 4, 7);
        printf("函数调用成功成功、\n");

        printf("%d %d %d\n",ret, index[0], index[1]);
        return 0;
}
#endif
int main(int argc, char *argv[]){
        Test1();
        Test2();
        Test3();
        Test4();
        Test5();
        Test6();
        Test7();
        return 0;
}
一下为输出:
linux@ubuntu:~/workdir/interview/string_operation$ ./a.out
Test1 start:
result val is:1
expected val is:1
Congratulations u find it !!!
Test2 start:
result val is:0
expected val is:0
There is some trouble ...!!
Test3 start:
result val is:1
expected val is:1
Congratulations u find it !!!
Test4 start:
result val is:1
expected val is:1
Congratulations u find it !!!
Test5 start:
result val is:0
expected val is:0
There is some trouble ...!!
Test6 start:
result val is:0
expected val is:0
There is some trouble ...!!
Test7 start:
result val is:0
expected val is:0
There is some trouble ...!!

这里引用http://blog.csdn.net/zyw_ym_zone/article/details/9321749 

题目描述:在一个二维数组中,每一行元素从左到右递增,从上到下递增,现输入一个整数,判断数组中是否存在该整数,要求时间复杂度为O(n)

思路:可以数组分为三个部分,数组右上角,左边,下面

例如:数组如下

1  2  8    9

2  4  9   12

4  7  10 13

6  8  11 15

查找元需为7,数组右上角元素为9

因为7<9,则在9左边的三列中寻找7元素,将col减1

1  2  8

2  4  9

4  7  10

6  8  11

再取数组右上角元素8,7<8,则在8左边的两列中寻找7元素,将col减1

1  2

2  4

4  7

6  8

再取数组右上角元素2,7>2,则在2下边三行中寻找元素7,注意此时的3行,值

2  4 

4  7

6  8,前面已经将col至2啦

再取数组的右上角元素4,7>4,则在4下边2行中寻找

4  7

6  8

再取数组的右上角元素7,7==4,返回,查找成功


版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

《剑指offer》阅读笔记-第1章

面试的三种形式        电话面试,预约好时间或者突然袭击,仅靠语言表达,尽量用形象的语言表达复杂问题        共享桌面远程面试,考查编程习惯和调试能力 思考清楚再开始编码,不要一听到题目就...

剑指offer阅读笔记 之面试题19 实现二叉树的镜像 之 又复习一遍二叉树

数据结构里,二叉树是个稍微复杂的数据结构,关于树的问题也都相对复杂,利用树解题的方法也较多,想要掌握树,要掌握最基本的树的遍历,温故而知新,求二叉树的镜像,其实就是遍历二叉树的结点,如果该结点有左孩子...

剑指offer书籍+源码

  • 2017年10月27日 20:52
  • 29.17MB
  • 下载

[剑指Offer]数组中重复的数字

题目描述: 在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 例如,如果输入长度...

【剑指offer】从尾到头打印单链表

题目描述: 输入一个链表,从尾到头打印链表每个节点的值。 输入: 每个输入文件仅包含一组测试样例。 每一组测试案例包含多行,每行一个大于0的整数,代表一个链表的节点。第一行是链表第一个节点的值,依次类...

剑指Offer 最新版

  • 2017年09月11日 10:38
  • 104.53MB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:剑指offer阅读有感
举报原因:
原因补充:

(最多只允许输入30个字)