剑指offer_数组

博客围绕在二维数组中查找整数展开。介绍了用vector定义二维数组、continue和break的使用、vector给二维数组赋值等知识点。还给出实现代码,包括普通二维数组查找函数、vector查找函数及测试函数,普通二维数组查找在牛客网编译可能因未判断越界不通过。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目:

在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数

复习的点

  1. 用vector定义二维数组的方式 vector arr;
  2. continue 跳出一次循环,执行下一次循环;break直接结束循环执行下一个语句
  3. 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;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值