数组
一、数组中重复的数字
题目描述:在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是第一个重复的数字2。
解题思路:考虑用哈希表进行操作。第一遍遍历整个数组更新哈希表值,第二遍遍历哈希表中对应元素值大于1的元素,输出该元素即为待查找元素。
classSolution {
public:// Parameters:// numbers: an array of integers// length: the length of array numbers// duplication: (Output) the duplicated number in the array number// Return value: true if the input is valid, and there are some duplications in the array number// otherwise falseboolduplicate(int numbers[], int length, int* duplication){//判空操作if(numbers==NULL||length==0)returnfalse;//定义并遍历哈希表int hashpub[7]={0};for(int i=0;i<length;i++){hashpub[numbers[i]]++;}for(int j=0;j<length;j++){if(hashpub[numbers[j]]>1){duplication[0]=numbers[j];returntrue;}}returnfalse;}
};
二、二维数组中的查找
题目:在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
解题思路:本题可以从左下角或者右上角两个方向进行搜索,以从左下角搜索为例,若左下角的数字小于待查找数字,则应该继续往该行右侧查找;若左下角的数字大于待查找数字,则应该从上面的行查找。
#方法一:从左下角开始遍历
classSolution {
public:boolFind(int target, vector<vector<int> > array){//判空操作if(array.empty())returnfalse;int row=array.size()-1; //行遍历int column=0;while(row>=0&&column<array[0].size()){if(array[row][column]==target)returntrue;elseif(array[row][column]>target){row--;}elsecolumn++;}returnfalse;}
};
#方法二:从右上角开始遍历
classSolution {
public:boolFind(int target, vector<vector<int> > array){if(array.empty())return0;int row=0;int col=array[0].size()-1;while(col>=0&&row<array.size()){if(target==array[row][col])return1;elseif(target<array[row][col])col--;elserow++;}return0;}
};
三、构建乘积数组
题目:给定一个数组A[0,1,...,n-1],请构建一个数组B[0,1,...,n-1],其中B中的元素B[i]=A[0]*A[1]*...*A[i-1]*A[i+1]*...*A[n-1]。不能使用除法。(注意:规定B[0] = A[1] * A[2] * ... * A[n-1],B[n-1] = A[0] * A[1] * ... * A[n-2];)
解题思路:这里可以考虑B[j]=(A[0]*...*A[j-1])*(A[j+1]*...*A[n-1])两部分分别求解,先对右半部分乘,再对左半部分乘。
classSolution {
public:vector<int> multiply(const vector<int>& A){int n=A.size();vector<int>B(n);int ret=1;//求右边for(int i=0;i<n;ret*=A[i++]){B[i]=ret;}ret=1;for(int j=n-1;j>=0;ret*=A[j--]){B[j]*=ret;}return B;}
};
四、调整数组顺序使奇数位于偶数前面
题目描述:输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。
解题思路:本题要求不仅仅是奇数部分位于前半部分,还有偶数部分位于后半部分,要想保证相对位置不变,就不能单纯通过穷举遍历来进行交换,因此在这里我用冒泡排序来解决,时间复杂度是


编辑。
classSolution {
public:voidreOrderArray(vector<int> &array){//使用冒泡排序for(int i=0;i<array.size();i++) //外层控制趟数for(int j=array.size()-1;j>i;j--)if(array[j]%2!=0&&array[j-1]%2==0){int tmp=array[j];array[j]=array[j-1];array[j-1]=tmp;}}
};
五、旋转数组的最小数字(考点:查找)
题目:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。
NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。
解题思路:本题可以考虑使用顺序查找的方法,时间复杂度为o(n)。同时,亦可以考虑使用二分查找的思路,由题目可以知后面部分总比前面部分小,那么只要将中间元素和左右两边进行对比,就可以知道最小值是在哪一边了,然后循环使用这种方法,最终只要right和left相邻,则right值即为最小值位置。
注意:在《剑指offer》中指出了两种我们需要考虑的情况
1、若排序数组的前面0个数字跑到最后面(即数组没变化),那么这时候第一个元素就是最小值,不用进行这么多遍历了
2、如果存在只挪动了1个元素的数组(如:{0,1,1,1}->{1,0,1,1}),这时候只能靠直接遍历了
classSolution {
public:intminNumberInRotateArray(vector<int> rotateArray){//判空操作if(rotateArray.empty())return0;int left=0,right=rotateArray.size()-1,mid=left;while(rotateArray[left]>=rotateArray[right]){mid=(left+right)/2;if(right-left==1){mid=right;break;}if(rotateArray[mid]<=rotateArray[right])right=mid;elseif(rotateArray[mid]>=rotateArray[left])left=mid;if(rotateArray[left]==rotateArray[mid]&&rotateArray[left]==rotateArray[right])returnByOrder(rotateArray,left,right);}if(left>=right)return0;return rotateArray[mid];}intByOrder(vector<int>a,int l,int r){int min=a[l];for(int i=l;i<=r;i++)if(a[i]<min){min=a[i];}return min;}
};
六、调整数组顺序使奇数位于偶数前面
题目描述:输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。
解题思路:两次遍历,第一次遍历只保存奇数的数,第二次保存在第一次的基础上,只是这次保留的是偶数。
classSolution {
public:voidreOrderArray(vector<int> &array){int size=array.size();if(size==0) return;vector<int>res;for(int i=0;i<size;i++){if(array[i]%2!=0)res.push_back(array[i]);}for(int i=0;i<size;i++){if(array[i]%2==0)res.push_back(array[i]);}array=res;}
};
反思:如果题目没有相对位置不变的要求?那么考虑使用快慢指针,头指针遍历前面的,尾指针遍历后面的,头指针遍历到偶数就和尾指针交换值,尾指针遍历到奇数就和头指针交换值。
classSolution {
public:voidreOrderArray(vector<int> &array){int size=array.size();if(size==0) return;int begin=0,end=size-1;while(begin<end){while(begin<end&&array[begin]%2!=0)begin++;while(begin<end&&array[end]%2==0)end--;//交换if(begin<end){int tmp=array[begin];array[begin]=array[end];array[end]=tmp;}}}
};
七、旋转矩阵
题目要求:实现矩阵顺时针旋转90度
解题思路:找到替换公式,本题迎刃而解。即


编辑
//方法一:时间复杂度和空间复杂度皆为O(n^2)classSolution {
public:voidrotate(vector<vector<int>>& matrix){int n = matrix.size();// C++ 这里的 = 拷贝是值拷贝,会得到一个新的数组auto matrix_new = matrix;for (int i = 0; i < n; ++i) {for (int j = 0; j < n; ++j) {matrix_new[j][n - i - 1] = matrix[i][j];}}// 这里也是值拷贝matrix = matrix_new;}
};
//方法二:节省空间复杂度的办法classSolution {
public:voidrotate(vector<vector<int>>& matrix){int n = matrix.size();for (int i = 0; i < n / 2; ++i) {for (int j = 0; j < (n + 1) / 2; ++j) {int temp = matrix[i][j];matrix[i][j] = matrix[n - j - 1][i];matrix[n - j - 1][i] = matrix[n - i - 1][n - j - 1];matrix[n - i - 1][n - j - 1] = matrix[j][n - i - 1];matrix[j][n - i - 1] = temp;}}}
};
反思:
水平翻转:


编辑
主对角线翻转:

八、数组中只出现一次的数字
题目描述:一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。
解题思路:本题考查了异或操作。
首先,从头到尾遍历,遍历出来不相同的数字
然后通过位运算便利出来第二个出现了一次的数字
最后找出来第一个出现了一次的数字
classSolution {
public:voidFindNumsAppearOnce(vector<int> data,int* num1,int *num2){int len=data.size();if(len<2) return;int counter=0;//先从头到尾遍历,遍历出来不同的数字for(int i=0;i<len;i++)counter=data[i]^counter;int flag=1;while(flag){if(flag&counter)break;flag=flag<<1; //逐个遍历}for(int i=0;i<len;i++){if((data[i]&flag)) *num1=*num1^data[i];else *num2=*num2^data[i];}}
};
九、数字在排序数组中出现的次数
题目描述:统计一数字在排序数组中出现的次数。
解题思路:使用两次遍历的方法,第一次使用二人查找,把相同的末位元素遍历出来;第二遍在数相同的有多少个。
classSolution {
public:intGetNumberOfK(vector<int> data ,int k){int start,end,mid,count=0,i;unsignedint len = data.size();if(!len)return0;start =0;end = len-1;mid = start;while(start<end){mid = (start+end)/2;if(k >data[mid])start = mid+1;if(k<data[mid])end = mid-1;if(k==data[mid])break;}i=mid;while( (i>=0) && (k==data[i])){i--;count++;}i=mid+1;while((i<len)&& (k==data[i]) ){i++;count++;}return count;}
};
十、剑指 Offer II 001. 整数除法(力扣)
题目描述:给定两个整数 a 和 b ,求它们的除法的商 a/b ,要求不得使用乘号 '*'、除号 '/' 以及求余符号 '%' 。
解题思路:使用减法代替除法。
classSolution {publicintdivide(int a, int b) {if(a==Integer.MIN_VALUE&&b==-1)return Integer.MAX_VALUE;int sign=((a>0)^(b>0))?-1:1;if(a>0)a=-a;if(b>0)b=-b;int res=0;while(a<=b){a-=b;res++;}return sign==1?res:-res;}
}十一、剑指 Offer II 006. 排序数组中两个数字之和
思路:使用二分查找
class Solution {public int[] twoSum(int[] numbers, int target) {for(int i=0;i<numbers.length;i++){int left=i+1,right=numbers.length-1;while(left<=right){int mid=(left+right)/2;if(target-numbers[i]==numbers[mid]){return new int[]{i,mid};}if(target-numbers[i]<numbers[mid]){right=mid-1;}else{left=mid+1;}}}return new int[]{-1,-1};}
}
相关文章:
数组
一、数组中重复的数字题目描述:在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 例如,如果输入长度为7的数组{2,3,1…...
MicroBlaze系列教程(4):AXI_UARTLITE的使用
文章目录 @[toc]AXI_UARTLITE简介MicroBlaze添加串口IP常用函数使用示例参考资料工程下载本文是Xilinx MicroBlaze系列教程的第4篇文章。 AXI_UARTLITE简介 axi_uartlite是Xilinx提供axi-lite接口的通用串口IP核,用AXI-Lite总线接口和用户进行交互,速度可以根据不同的芯片调…...
GO 中的 init 函数
前言 go 语言中有一个非常神奇的函数 init ,它可以在所有程序执行开始前被执行,并且每个 package 下面可以存在多个 init 函数,我们一起来看看这个奇怪的 init 函数。 init 特性 init 函数在 main 函数之前执行,并且是自动执行;…...
使用C#编写k8s CRD Controller
本文项目地址:k8s-crd - Repos (azure.com)CRDCRD指的是Custom Resource Definition。开发者更多的关注k8s对于容器的编排与调度,这也是k8s最初惊艳开发者的地方。而k8s最具价值的地方是它提供了一套标准化、跨厂商的 API、结构和语义。k8s将它拥有的一切…...
Ansible---playbook剧本
目录 引言:什么是playbook? 一、Playbook 1.1、playbook中的核心元素 1.2、playbook中的基础组件 1.3、playbook格式说明 1.4、实例:httpd服务剧本 二、playbook中的模块 2.1、Templates 模块 2.2、tags 模块 2.3、Roles 模块 引言&…...
Delphi 中TImageCollection和TVirtualImageList 控件实现high-DPI
一、概述RAD Studio允许你通过使用TImageCollection组件和TVirtualImageList组件,在你的Windows VCL应用程序中包含缩放、高DPI、多分辨率的图像。这两个组件位于Windows 10面板中:注意:如果你使用FireMonkey进行跨平台应用,请看T…...
Ros中如何给UR5配置自定义工具 | 在Rviz中给UR5机器人装载定义工具 | UR5配置自定义末端执行器
前言 在学习和项目研究的过程中,我需要在Ur5e上装上工具,以对现实场景进行仿真。网上会有一些装载/配置现成的夹爪,例如Robotiq等。但和我们装载自定义工具的场景还有些差异,因此写一篇博客记录,可能有偏差。如果有问…...
数据库 delete 表数据后,磁盘空间为什么还是被一直占用?
插: 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。 坚持不懈,越努力越幸运,大家一起学习鸭~~~ 最近有个上位机获取下位机上报数据的项目,…...
docker-微服务篇
docker学习笔记1.docker简介1.1为什么会出现docker?1.2docker理念1.3虚拟机(virtual machine)1.4容器虚拟化技术1.5一次构建到处运行2.docker安装2.1前提条件2.2docker基本构成2.3docker安装步骤*2.4测试镜像3.docker常用命令3.1 启动docker3…...
图像优化篇
目录(1)矢量图(2)位图 2.1 分辨率2,图像格式格式选择建议:(1)矢量图 被定义为一个对象,包括颜色,大小,形状,以及屏幕位置等属性&…...
在surface go 2上安装ubuntu 20.04
在surface go 2上安装ubuntu 20.04 1.制作安装盘 下载ubuntu系统的iso文件 使用Rufus软件将u盘制作为ubuntu系统的安装盘 2.在surface go 2上操作 禁用快速启动 在 Windows 中,禁用“电源选项”中的“快速启动”>选择电源按钮的功能 禁用 Bitlocker 在 Wi…...
Java:SpringMVC的使用(1)
目录第一章、SpringMVC基本了解1.1 概述1.2 SpringMVC处理请求原理简图第二章、SpringMVC搭建框架1、搭建SpringMVC框架1.1 创建工程【web工程】1.2 导入jar包1.3 编写配置文件(1) web.xml注册DispatcherServlet(2) springmvc.xml(3) index.html1.4 编写请求处理器【Controller…...
自动化测试岗位求职简历编写规范+注意事项,让你的简历脱颖而出
目录 前言 1.个人信息 2.教育背景(写最高学历) 3.个人技能(按精通/掌握/熟练/了解层次来写) 4.工作经历 5.工作经验/项目经历 6.自我评价 总结 前言 挑选一个阅读舒适度不错的模板 HR和面试官看的简历多,都是快速阅读,舒适度特别重要;…...
C 字符串
在 C 语言中,字符串实际上是使用空字符 \0 结尾的一维字符数组。因此,\0 是用于标记字符串的结束。空字符(Null character)又称结束符,缩写 NUL,是一个数值为 0 的控制字符,\0 是转义字符&#…...
【每日一题Day115】LC2335装满杯子需要的最短总时长 | 贪心
装满杯子需要的最短总时长【LC2335】 You have a water dispenser that can dispense cold, warm, and hot water. Every second, you can either fill up 2 cups with different types of water, or 1 cup of any type of water. You are given a 0-indexed integer array amo…...
Flink流计算处理-旁路输出
使用Flink做流数据处理时,除了主流数据输出,还自定义侧流输出即旁路输出,以实现灵活的数据拆分。 定义旁路输出标签 首先需要定义一个OutputTag,代码如下: // 这需要是一个匿名的内部类,以便我们分析类型…...
nginx正向代理的配置和使用
nginx正向代理的配置和使用 nginx正向代理的配置和使用nginx正向代理的配置和使用安装包准备下载nginx安装包下载正向代理模块的包版本与模块对照表部署nginx服务上传nginx包和正向模块包解压,改名安装nginx配置正向代理创建nginx用户检查nginx配置并启动nginx服务所在服务器验…...
Oracle Trace File Analyzer 介绍及简单使用
一、什么是Oracle Trace File Analyzer Oracle Autonomous Health Framework(AHF) 包含 Oracle ORAchk, Oracle EXAchk, and Oracle Trace File Analyzer(TFA). AHF工具包包含了Oracle常用的多种诊断工具,如 ORAchk, Oracle EXAchk, and Oracle Trace File Analyzer…...
面试实战篇 | 快手本地生活,结合项目谈Redis实战项目场景?MySQL InnoDB存储引擎如何工作的?策略模式?
本期是【你好,面试官】系列文章的第21期,持续更新中…。 《你好,面试官》系列目前已经连载20篇了,据说看了这个系列的朋友都拿到了大厂offer~ 你好,面试官 | 你真的理解面向 “对象”?你好,面…...
Hadoop之——WordCount案例与执行本地jar包
目录 一、WordCount代码 (一)WordCount简介 1.wordcount.txt (二)WordCount的java代码 1.WordCountMapper 2.WordCountReduce 3.WordCountDriver (三)IDEA运行结果 (四)Hadoop运行wordcount 1.在HDFS上新建一个文件目录 2.新建一个文件,并上传至该目录下…...
国防科技大学计算机基础课程笔记02信息编码
1.机内码和国标码 国标码就是我们非常熟悉的这个GB2312,但是因为都是16进制,因此这个了16进制的数据既可以翻译成为这个机器码,也可以翻译成为这个国标码,所以这个时候很容易会出现这个歧义的情况; 因此,我们的这个国…...
业务系统对接大模型的基础方案:架构设计与关键步骤
业务系统对接大模型:架构设计与关键步骤 在当今数字化转型的浪潮中,大语言模型(LLM)已成为企业提升业务效率和创新能力的关键技术之一。将大模型集成到业务系统中,不仅可以优化用户体验,还能为业务决策提供…...
基于距离变化能量开销动态调整的WSN低功耗拓扑控制开销算法matlab仿真
目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.算法仿真参数 5.算法理论概述 6.参考文献 7.完整程序 1.程序功能描述 通过动态调整节点通信的能量开销,平衡网络负载,延长WSN生命周期。具体通过建立基于距离的能量消耗模型&am…...
2025年能源电力系统与流体力学国际会议 (EPSFD 2025)
2025年能源电力系统与流体力学国际会议(EPSFD 2025)将于本年度在美丽的杭州盛大召开。作为全球能源、电力系统以及流体力学领域的顶级盛会,EPSFD 2025旨在为来自世界各地的科学家、工程师和研究人员提供一个展示最新研究成果、分享实践经验及…...
为什么需要建设工程项目管理?工程项目管理有哪些亮点功能?
在建筑行业,项目管理的重要性不言而喻。随着工程规模的扩大、技术复杂度的提升,传统的管理模式已经难以满足现代工程的需求。过去,许多企业依赖手工记录、口头沟通和分散的信息管理,导致效率低下、成本失控、风险频发。例如&#…...
python爬虫:Newspaper3k 的详细使用(好用的新闻网站文章抓取和解析的Python库)
更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、Newspaper3k 概述1.1 Newspaper3k 介绍1.2 主要功能1.3 典型应用场景1.4 安装二、基本用法2.2 提取单篇文章的内容2.2 处理多篇文档三、高级选项3.1 自定义配置3.2 分析文章情感四、实战案例4.1 构建新闻摘要聚合器…...
Android15默认授权浮窗权限
我们经常有那种需求,客户需要定制的apk集成在ROM中,并且默认授予其【显示在其他应用的上层】权限,也就是我们常说的浮窗权限,那么我们就可以通过以下方法在wms、ams等系统服务的systemReady()方法中调用即可实现预置应用默认授权浮…...
【开发技术】.Net使用FFmpeg视频特定帧上绘制内容
目录 一、目的 二、解决方案 2.1 什么是FFmpeg 2.2 FFmpeg主要功能 2.3 使用Xabe.FFmpeg调用FFmpeg功能 2.4 使用 FFmpeg 的 drawbox 滤镜来绘制 ROI 三、总结 一、目的 当前市场上有很多目标检测智能识别的相关算法,当前调用一个医疗行业的AI识别算法后返回…...
基于IDIG-GAN的小样本电机轴承故障诊断
目录 🔍 核心问题 一、IDIG-GAN模型原理 1. 整体架构 2. 核心创新点 (1) 梯度归一化(Gradient Normalization) (2) 判别器梯度间隙正则化(Discriminator Gradient Gap Regularization) (3) 自注意力机制(Self-Attention) 3. 完整损失函数 二…...
android13 app的触摸问题定位分析流程
一、知识点 一般来说,触摸问题都是app层面出问题,我们可以在ViewRootImpl.java添加log的方式定位;如果是touchableRegion的计算问题,就会相对比较麻烦了,需要通过adb shell dumpsys input > input.log指令,且通过打印堆栈的方式,逐步定位问题,并找到修改方案。 问题…...
