题目:
在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数
复习的点
- 用vector定义二维数组的方式 vector arr;
- continue 跳出一次循环,执行下一次循环;break直接结束循环执行下一个语句
- vector给二维数组赋值
//申请空间
vector<vector<int>> arr;
arr.resize(10, vector<int>(10));
//二维数组赋值
for (int i = 0; i < ROW; ++i)
{
for (int j = 0; j < COL; ++j)
{
arr[i][j] = j*i;
cout << arr[i][j]<<" ";
}
cout << "=====" << endl;
}
3 实现代码
本代码简要说明:
- void findData_arr()函数是通过普通二维数组方式查找一个数是否在数组中,在牛客网编译时并并通过,原因可能时没有判断数组是否越界
- void findData_vector()函数是舶来品,代码中详细描述了每一步的步骤及写法含义
- void testData()函数用来测试上述两个函数是否成功,其中应用到了随机数种子知识点
#include<iostream>
#include<vector>
#include<time.h>
#include<stdlib.h>
using std::vector;
using namespace std;
#define ROW 10
#define COL 10
#define testCount 2
//用二维数组的方式查找元素是否再数组中
void findData_arr()
{
//step1. 输入这样一个数组
int arr[ROW][COL];
int num = 0, numCout = 0, searchNum;
for (int i = 0; i < ROW; ++i)
{
for (int j = 0; j < COL; ++j)
{
arr[i][j] = num;
num++;
//cout << arr[i][j] << " ";
}
//cout << endl;
}
//step2. 随机输入一个整数,判断这个整数是否在数组中
cout << "please enter a srand number for searching" << endl;
cin >> searchNum;
for (int i = 0; i < ROW; ++i)
{
for (int j = 0; j < COL; ++j)
{
numCout++;
if (searchNum == arr[i][j])
{
cout << searchNum << " is in this arr" << endl;
break;
}
}
}
if (numCout == 100 && searchNum != arr[ROW][COL])cout << searchNum << " is not in this arr" << endl;
}
//用vector创建的二维数组查找元素,代码通过
bool FindData_vector(int target, vector<vector<int> > array)
{
if (array.empty())return false;//判断数组是否为空(arr[]数组)
if (target < array[0][0])return false;//判断target是否小于最小数,小于返回家
int _length = array.size();//确定数组行长度
for (int i = 0; i < _length; i++)
{
if (array[i].empty())continue;//如果第i列数组为空,则结束当前循环,执行下一次循环
else if (target >= array[i][0])//如果target大于等于数组的i行0列值,则进入下一步判断,否则执行else,结束本次循环
{
if (target <= array[i][array[i].size() - 1])//size()返回容器的长度,这里注意二维数组列的长度判断写法
{
for (int j = array[i].size() - 1; j >= 0; j--)
{
if (target == array[i][j])return 1;
else if (target > array[i][j])break;
}
}
else//如果不满足74步的判断则退出当前循环i++,进行下一列的判断
{
continue;
}
}
else return false;
}
return false;
}
//测试函数,用来检测逻辑是否严谨
void testData()
{
int target = 0, count = 0;
int num = 0;
//创建一个二维数组,并给二维数组赋值
vector<vector<int>> arr;//定义一个二维数组
arr.resize(10, vector<int>(10));//给二维数组确定空间
//利用双重循环给二维数组赋值
for (int i = 0; i < ROW; ++i)
{
for (int j = 0; j < COL; ++j)
{
arr[i][j] = num;//给二维数组赋值,值按照从左至右,从上到下递增变化;vector二维数组赋值的写法同普通二维数组一样
num++;
}
}
//测试所写的再二维数组中查找一个值是否存在的具体代码
srand((unsigned)time(NULL));//创建一个随机数种子
while (count != testCount)//通过修改testCount可以更改测试的次数
{
target = rand() % 200;//将随机数赋值给待检测值
if (FindData_vector(target, arr) != false)cout << target<<" is in this arr" << endl << "=============\n";//检测
else cout <<target<< " is not in this arr" << endl<<"=============\n";//检测
count++;
}
}
int main()
{
testData();
cin.get();
return 0;
}