C语言面试C++二维数组中的查找示例

 更新时间:2021年09月28日 10:43:57   作者:小码农UU  
这篇文章主要介绍了C语言面试C++二维数组中的查找示例,文中给出基本能拿下面试官的操作示例,有需要的朋友可以借鉴参考下,希望能够有所帮助

二维数组中的查找

面试题3:

image-20210910134358545

似题:

我做过这个类似的有杨氏矩阵为背景的,实际上是一样的

暴力遍历

二维数组暴力遍历的话时间复杂度为O(n2)

虽然暴力但是应付学校考试这个就是一把好手

#include<stdio.h>
//const 就是因为二维数组是定死的
int search(const int arr[4][4], int num,unsigned int* prow,unsigned int* pcol)
{
	int i = 0;
	//扫描行
	for (i = 0; i < *prow; i++)
	{
		//扫描列
		int j = 0;
		for (j = 0; j < *pcol; j++)
		{
			//与所查数比较判断,有一样的就直接返回
			if (arr[i][j] == num)
			{
				*prow = i;//把坐标传回去
				*pcol = j;
				return 1;//一次返回,之后就不看了,因为已经证明到有这个数了,没必要在做无用功了
			}
		}
	}
	return 0;
}
int main()
{
	int arr[4][4] = { {1,2,8,9},{2,4,9,12},{4,7,10,13},{6,8,11,15} };
	int num = 0;
	while (1)
	{
		unsigned int row = sizeof(arr) / sizeof(arr[0]);
		unsigned int col = sizeof(arr[0]) / sizeof(arr[0][0]);   //把row,col拉进来就是为了每次再来是更新一次
		//长宽,因为下面我们就是用row,col变量没有用其他变量
		printf("请输入你想要找的数:>");
		scanf("%d", &num);
		if (search(arr, num, &row, &col))//把长宽传地址过去用指针prow,pcol接收
		{
			printf("有这个数\n");
			printf("坐标为(%d,%d)\n", row, col);
		}
		else
		{
			printf("没有这个数\n");
		}
	}	
	return 0;
}

image-20210910163325915

动态基点操作

暴力操作肯定拿不下面试官的心,没有思想,应该优化程序,减小时间复杂度

image-20210910165659391

image-20210910170432274

image-20210910170800065

然后把上面search函数改改就可以了

时间复杂度也降为O(n)

#include<stdio.h>
//const 就是因为二维数组是定死的
int search(const int arr[4][4], int num,unsigned int* prow,unsigned int* pcol)
{
	int i = 0;
	unsigned int x = 0;
	unsigned int y = *pcol-1;
	while ((x<*prow)&&(y>=0))
	{
		if (arr[x][y] - num > 0)
		{
			y--;
		}
		else if (arr[x][y] - num < 0)
		{
			x++;
		}
		else
		{
			*prow = x;
			*pcol = y;
			return 1;
		}
	}
	return 0;
}
int main()
{
	int arr[4][4] = { {1,2,8,9},{2,4,9,12},{4,7,10,13},{6,8,11,15} };
	int num = 0;
	while (1)
	{
		unsigned int row = sizeof(arr) / sizeof(arr[0]);
		unsigned int col = sizeof(arr[0]) / sizeof(arr[0][0]);   //把row,col拉进来就是为了每次再来是更新一次
		//长宽,因为下面我们就是用row,col变量没有用其他变量
		printf("请输入你想要找的数:>");
		scanf("%d", &num);
		if (search(arr, num, &row, &col))//把长宽传地址过去用指针prow,pcol接收
		{
			printf("有这个数\n");
			printf("坐标为(%d,%d)\n", row, col);
		}
		else
		{
			printf("没有这个数\n");
		}
	}	
	return 0;
}

image-20210910172040278

结果也是不错的

以上就是C语言面试C++二维数组中的查找示例的详细内容,更多关于C++二维数组中的查找的资料请关注脚本之家其它相关文章!

相关文章

  • C++中的extern声明变量详解

    C++中的extern声明变量详解

    这篇文章主要介绍了C++中的extern声明变量详解,本文讲解了声明和定义、extern声明全局变量、extern声明函数等内容,需要的朋友可以参考下
    2015-03-03
  • C++设计模式之命令模式

    C++设计模式之命令模式

    这篇文章主要介绍了C++设计模式之命令模式,本文讲解了什么是命令模式、命令模式的使用场合等内容,并给出了一个代码实例,需要的朋友可以参考下
    2014-10-10
  • C++ 中静态成员函数与非静态成员函数的区别

    C++ 中静态成员函数与非静态成员函数的区别

    这篇文章主要介绍了C++ 中静态成员函数与非静态成员函数的区别的相关资料,需要的朋友可以参考下
    2017-05-05
  • C++轻量级界面开发框架ImGUI介绍小结

    C++轻量级界面开发框架ImGUI介绍小结

    如果从事过C++ Windows客户端开发,大家对MFC、Qt、DuiLib等各种DirectUI应该有了解,本篇给大家介绍一个超级轻量级的C++开源跨平台图形界面框架ImGUI,感兴趣的可以了解一下
    2021-11-11
  • C++ OpenCV实战之图像透视矫正

    C++ OpenCV实战之图像透视矫正

    这篇文章主要介绍了通过C++ OpenCV实现图像的透视矫正,文中的示例代码讲解详细,对我们的学习或工作有一定的参考价值,感兴趣的可以了解一下
    2022-01-01
  • 使用boost读取XML文件详细介绍

    使用boost读取XML文件详细介绍

    这篇文章主要介绍了使用boost读取XML文件详细介绍的相关资料,需要的朋友可以参考下
    2016-11-11
  • C语言实现linux网卡检测精简版

    C语言实现linux网卡检测精简版

    这篇文章主要为大家详细介绍了C语言实现linux网卡检测的精简版,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-06-06
  • C++模拟实现list功能

    C++模拟实现list功能

    list的底层是一个循环双向链表结构,双向链表中每个元素存储在互不相关的独立节点中,在节点中通过指针指向其前一个元素和后一个元素,接下来通过本文给大家分享C++模拟实现list的示例代码,需要的朋友可以参考下
    2021-08-08
  • C语言入门篇--函数及数组用法

    C语言入门篇--函数及数组用法

    本篇文章是c语言基础篇,主要为大家介绍了C语言的函数与数组,每个函数本质上都实现一个最小的功能,而main函数只负责调用函数,实现代码的核心逻辑,提高代码的可维护性
    2021-08-08
  • VsCode搭建C语言运行环境详细过程及终端乱码问题解决方案

    VsCode搭建C语言运行环境详细过程及终端乱码问题解决方案

    这篇文章主要介绍了VsCode搭建C语言运行环境以及终端乱码问题解决,在VsCode中搭建C/C++运行环境需要先安装几个插件,具体插件文中给大家详细介绍,需要的朋友可以参考下
    2022-12-12

最新评论