剑指offer:面试的基础知识(三)

三、查找和排序

查找不外乎顺序查找、二分查找、哈希表查找和二叉排序树。排序比哈希稍微复杂,插入排序、冒泡、归并排序、快速排序等不同算法的优劣与代码编写应该要非常熟悉。这些基于比较的算法,平均时间复杂度最好为O(nlogn)。如果需要线性时间内排序,那么需要考虑桶排之类的算法了。

面试题8:旋转数组的最小数字

题目:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增的数组的一个旋转,输出旋转数组的最小元素。例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组最小为1。

解析:这道题和之前遍历二维数组一样,直观的解法很容易,遍历一遍数组找到最小的值。但是如果想要更高效的算法必然要观察数据的规律。由于这是查找,而且数组基本算是有序,二分查找算是不错的选择!

int Min(int* a, int len){
	if(a==NULL || len<=0)
		throw new std::exception("Invaild input");
		
	int low=0;
	int high=len-1;
	
	while(a[low]>=a[high]){       //(1)循环条件
		if(high-low==1) return a[high];  //(2)结束条件
		int mid=(low+high)/2;
		
		if(a[mid]==a[low]&&a[high]==a[mid]){
			cout<<"只能顺序找"<<endl;	
		}
		
		if(a[mid]>a[low]){   
			low=mid;  //(3)
		}
		else if(a[mid]<a[high]){
			high=mid;  //(4)	
		}
	}
	return a[low];	
}

这道题算是一种改进版的二分查找吧,原始的二分查找是要找到某个值,通过将中间值和目标值val比较,缩小搜索范围。而这里实质是要找到一个范围,通过将中间的值和两边值比较,缩小范围。原始二分查找的循环条件是low<=high;而改进版的是a[low]>=a[high],否则没有搜索意义了。

int bisearch(int a[],int low, int high, int val){
	while(low<=high){
		int mid=(low+high)/2;
		if(a[mid]<val) high=mid-1;
		else if(a[mid]>val) low=mid+1;
		else return mid;
	} 
	return -1;
} 

面试题38:数字在排序数组中出现的次数

题目:统计一个数字在排序数组中出现的次数。例如输入排序数组{1,2,3,3,3,3,4,5}和数字3,由于3在这个数组中出现了4次,因此输出4.

解析:这里是在有序的数组里统计某个数出现的个数。虽然顺序查询也可以求得所需的结果,但是更高效的算法可以借助二分查找。基本思路是找到第一个k和最后一个k出现的位置,然后计算k出现的个数。

int getFirstK(int *a, int len, int k){
	int low=0;
	int high=len-1;
	while(low<=high){
		int mid=(low+high)/2;
		if(a[mid]==k){
			if(mid==0|| mid>0&&a[mid-1]!=k) 
				return mid;
			else
				high=mid-1;
		}
		else if(a[mid]<k) low=mid+1;
		else high=mid-1;
	}
	return -1;
}

int getLastK(int *a, int len, int k){
	int low=0;
	int high=len-1;
	while(low<=high){
		int mid=(low+high)/2;
		if(a[mid]==k){
			if(mid==len-1|| mid<len-1&&a[mid+1]!=k) 
				return mid;
			else
				low=mid+1;
		}
		else if(a[mid]<k) low=mid+1;
		else high=mid-1;
	}
	return -1;
}

int getNumberOfK(int *a, int len, int k){
	int number =0;
	if(a!=NULL&&len>0){
		int first=getFirstK(a,len,k);
		int last=getLastK(a,len,k);	
		if(first>-1&&last!=-1)
			number=last-first+1;
	}
	return number;	
} 
虽然这道题并不是很明显的二分查找题目,但是如果对二分查找理解深刻的话,应该会想到。再说了,能提高搜索效率的,除了借助额外的hash表,只能想到二分查找了~



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
资源包主要包含以下内容: ASP项目源码:每个资源包中都包含完整的ASP项目源码,这些源码采用了经典的ASP技术开发,结构清晰、注释详细,帮助用户轻松理解整个项目的逻辑和实现方式。通过这些源码,用户可以学习到ASP的基本语法、服务器端脚本编写方法、数据库操作、用户权限管理等关键技术。 数据库设计文件:为了方便用户更好地理解系统的后台逻辑,每个项目中都附带了完整的数据库设计文件。这些文件通常包括数据库结构图、数据表设计文档,以及示例数据SQL脚本。用户可以通过这些文件快速搭建项目所需的数据库环境,并了解各个数据表之间的关系和作用。 详细的开发文档:每个资源包都附有详细的开发文档,文档内容包括项目背景介绍、功能模块说明、系统流程图、用户界面设计以及关键代码解析等。这些文档为用户提供了深入的学习材料,使得即便是从零开始的开发者也能逐步掌握项目开发的全过程。 项目演示与使用南:为帮助用户更好地理解和使用这些ASP项目,每个资源包中都包含项目的演示文件和使用南。演示文件通常以视频或图文形式展示项目的主要功能和操作流程,使用南则详细说明了如何配置开发环境、部署项目以及常见问题的解决方法。 毕业设计参考:对于正在准备毕业设计的学生来说,这些资源包是绝佳的参考材料。每个项目不仅功能完善、结构清晰,还符合常见的毕业设计要求和标准。通过这些项目,学生可以学习到如何从零开始构建一个完整的Web系统,并积累丰富的项目经验。
资源包主要包含以下内容: ASP项目源码:每个资源包中都包含完整的ASP项目源码,这些源码采用了经典的ASP技术开发,结构清晰、注释详细,帮助用户轻松理解整个项目的逻辑和实现方式。通过这些源码,用户可以学习到ASP的基本语法、服务器端脚本编写方法、数据库操作、用户权限管理等关键技术。 数据库设计文件:为了方便用户更好地理解系统的后台逻辑,每个项目中都附带了完整的数据库设计文件。这些文件通常包括数据库结构图、数据表设计文档,以及示例数据SQL脚本。用户可以通过这些文件快速搭建项目所需的数据库环境,并了解各个数据表之间的关系和作用。 详细的开发文档:每个资源包都附有详细的开发文档,文档内容包括项目背景介绍、功能模块说明、系统流程图、用户界面设计以及关键代码解析等。这些文档为用户提供了深入的学习材料,使得即便是从零开始的开发者也能逐步掌握项目开发的全过程。 项目演示与使用南:为帮助用户更好地理解和使用这些ASP项目,每个资源包中都包含项目的演示文件和使用南。演示文件通常以视频或图文形式展示项目的主要功能和操作流程,使用南则详细说明了如何配置开发环境、部署项目以及常见问题的解决方法。 毕业设计参考:对于正在准备毕业设计的学生来说,这些资源包是绝佳的参考材料。每个项目不仅功能完善、结构清晰,还符合常见的毕业设计要求和标准。通过这些项目,学生可以学习到如何从零开始构建一个完整的Web系统,并积累丰富的项目经验。
资源包主要包含以下内容: ASP项目源码:每个资源包中都包含完整的ASP项目源码,这些源码采用了经典的ASP技术开发,结构清晰、注释详细,帮助用户轻松理解整个项目的逻辑和实现方式。通过这些源码,用户可以学习到ASP的基本语法、服务器端脚本编写方法、数据库操作、用户权限管理等关键技术。 数据库设计文件:为了方便用户更好地理解系统的后台逻辑,每个项目中都附带了完整的数据库设计文件。这些文件通常包括数据库结构图、数据表设计文档,以及示例数据SQL脚本。用户可以通过这些文件快速搭建项目所需的数据库环境,并了解各个数据表之间的关系和作用。 详细的开发文档:每个资源包都附有详细的开发文档,文档内容包括项目背景介绍、功能模块说明、系统流程图、用户界面设计以及关键代码解析等。这些文档为用户提供了深入的学习材料,使得即便是从零开始的开发者也能逐步掌握项目开发的全过程。 项目演示与使用南:为帮助用户更好地理解和使用这些ASP项目,每个资源包中都包含项目的演示文件和使用南。演示文件通常以视频或图文形式展示项目的主要功能和操作流程,使用南则详细说明了如何配置开发环境、部署项目以及常见问题的解决方法。 毕业设计参考:对于正在准备毕业设计的学生来说,这些资源包是绝佳的参考材料。每个项目不仅功能完善、结构清晰,还符合常见的毕业设计要求和标准。通过这些项目,学生可以学习到如何从零开始构建一个完整的Web系统,并积累丰富的项目经验。
资源包主要包含以下内容: ASP项目源码:每个资源包中都包含完整的ASP项目源码,这些源码采用了经典的ASP技术开发,结构清晰、注释详细,帮助用户轻松理解整个项目的逻辑和实现方式。通过这些源码,用户可以学习到ASP的基本语法、服务器端脚本编写方法、数据库操作、用户权限管理等关键技术。 数据库设计文件:为了方便用户更好地理解系统的后台逻辑,每个项目中都附带了完整的数据库设计文件。这些文件通常包括数据库结构图、数据表设计文档,以及示例数据SQL脚本。用户可以通过这些文件快速搭建项目所需的数据库环境,并了解各个数据表之间的关系和作用。 详细的开发文档:每个资源包都附有详细的开发文档,文档内容包括项目背景介绍、功能模块说明、系统流程图、用户界面设计以及关键代码解析等。这些文档为用户提供了深入的学习材料,使得即便是从零开始的开发者也能逐步掌握项目开发的全过程。 项目演示与使用南:为帮助用户更好地理解和使用这些ASP项目,每个资源包中都包含项目的演示文件和使用南。演示文件通常以视频或图文形式展示项目的主要功能和操作流程,使用南则详细说明了如何配置开发环境、部署项目以及常见问题的解决方法。 毕业设计参考:对于正在准备毕业设计的学生来说,这些资源包是绝佳的参考材料。每个项目不仅功能完善、结构清晰,还符合常见的毕业设计要求和标准。通过这些项目,学生可以学习到如何从零开始构建一个完整的Web系统,并积累丰富的项目经验。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值