面試題之二維數組中的查找

    題目:在一個二維數組中,每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成一個函數,輸入這樣一個二維數組和一個整數,判斷數組中是否含有該整數。

   例如:

    1     2      8      9

   2      4      9      12

  4       7      10    13

  6      8       11     15

  如果查找數字7,則返回true,如果查找數字5,則返回false.

  對於這道題主要考察二維數組的存儲,二維數組在內存中是一維存儲,從上到下存儲各行元素,在同一行中按照左向右的順序存儲。因此可以根據行號和列號計算出數組首地址的偏移量,從而可以找到對應的元素。

  該題的大致思路就是從最後一列向前進行比較,找到比key小的之後從行的上面向下遍歷。。。

  下面給出具體的代碼:

#include<iostream>
#include<stdlib.h>

using namespace std;
#define N 4

bool Iskey_exist(int *a,int rows,int cols,int key)
{
    bool found = false;
    if(a != NULL && rows > 0 && cols > 0){
        int row = 0;
        int col = cols - 1;
        while(row < rows && col >= 0){
            if(a[row * cols + col] == key){
                found = true;
                break;
            }else if(a[row * cols + col] > key){
                --col;
            }else{
                ++row;
            }
        }
    }
    return found;
}
int main(int argc,char**argv)
{
    int a[N][N];
    int key;
    
    cout << "please input elements:"<<endl;
    for(int i = 0;i < N; ++i){
        for(int j = 0;j < N ;++j){
            cin >> a[i][j];
        }
    }
    while(1){
        cout << "please input key:(-1 == quit) "<<endl;
        cin >> key;
        if(key == -1){
            cout << "error!!" << endl;
            exit(1);
        }
        if(Iskey_exist((int *)a,N,N,key)){
            cout << key << " is found!!"<< endl;
        }else{
            cout << key << " is not found !!"<<endl;
        }
    }
    return 0;
}

其執行結果:


 
發佈了65 篇原創文章 · 獲贊 19 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章