自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(85)
  • 收藏
  • 关注

原创 【剑指offr--C/C++】JZ7 重建二叉树

我们可以根据二者的特点结合一下:对于前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6}, 根据前序可知1是树的根节点,那么再看中序就可以用1分成左子树{4,7,2}和右子树{5,3,8,6}。再看前序的第二个元素是2,2就是左子树的根节点,于是{4,7}是2的左子树,2没有右子树。以此类推就可以得到一颗完整的树。前序遍历:中、左、右。所以前序遍历的第一个节点是树的根节点,第二个节点是左子树的根节点。中序遍历:左、中、右。树的根节点在中间某处。

2024-04-05 19:29:17 310

原创 【剑指offr--C/C++】JZ54 二叉搜索树的第k个节点

/取出栈顶元素,计数器+1,若==k,则返回该节点值。//否则,进入该节点的右子树并重复上述压栈取值操作。//借助辅助栈,依次读取左值并压入栈中,知道最左。//若没有右子树则会继续取出栈顶元素。

2024-04-05 17:55:45 362

原创 【剑指offr--C/C++】JZ55 二叉树的深度

每一个节点的深度都=max{左子树深度,右子树深度}+1。//先将root放进去,记录当前这一层的节点个数,//然后依次取出这一层节点并将其左右子节点放进去。求二叉树深度两个思路:递归、层次遍历。//重复上述步骤直到节点遍历完成。//层次遍历:用队列辅助。三、层次遍历思路及代码。

2024-04-05 17:06:36 179

原创 【剑指offr--C/C++】JZ59 滑动窗口的最大值

我这里考虑:窗口每次往后移动一位,那么如果当前窗口的最大值max在窗口内部,那么再滑动到下一个窗口的时候,窗口内只有最新进来的一个元素没有跟max做过比较,只需要让他俩比较一下即可。通过这种方式能比暴力比较节省一点时间。暴力解法是依次往后滑动一位,然后比较窗口内的值。

2024-04-04 19:17:09 321

原创 【剑指offr--C/C++】JZ73 翻转单词序列

①遍历字符串,通过空格来确定单词。③依次出栈组成新的字符串。②将单词和空格依次入栈。

2024-04-04 18:24:40 168

原创 【剑指offr--C/C++】JZ31 栈的压入、弹出序列

③如果相同就不用入栈了(不入栈=出栈),然后再依次取出栈的栈顶元素看是否与出栈数组当前值相同,相同的话就依次出栈,知道不再相等或者全部出栈;①在入栈之前先判断当前要入栈的元素是否与出栈数组当前元素相同,④若入栈元素还没有遍历完,就继续重复前三个步骤。借助一个辅助栈来模拟入栈过程,② 如果不相同就入栈;

2024-04-04 17:58:00 293

原创 【剑指offr--C/C++】JZ30 包含min函数的栈

step 3:每次push元素的时候与第二个栈的栈顶元素比较,若是较小,则进入第二个栈,若是较大,则第二个栈的栈顶元素再次入栈,因为即便加了一个元素,它依然是最小值。于是,每次访问最小值即访问第二个栈的栈顶。可以利用双栈来完成寻找最小值的操作,从stack1中依次取出元素放到stack2并记录最小值,这样元素全部取出后最小值旧得到了,再把元素依次放回到stack1中即可。step 1:使用一个栈记录进入栈的元素,正常进行push、pop、top操作。step 2:使用另一个栈记录每次push进入的最小值。

2024-04-04 16:36:38 293

原创 【剑指offr--C/C++】JZ9 用两个栈实现队列

栈是先进后出,队列是先进先出,也就是说从push角度来说二者顺序相同,而从pop的角度来说二者顺序正好是相反的,那我们就可以一个栈中push,一个栈中pop。在一个stack1中进行push,然后每当需要pop的时候就将stack1中的元素依次取出放到stack2中,那么正好stack2的顺序就与队列相同了,从stack2取出栈顶元素,取完以后再把元素都放回stack1。

2024-04-04 16:16:17 270

原创 创建一个maven项目以及Sonatype Nexus私服使用

1.下载nexus软件(官网太慢,csdn找的)并解压,nexus-3.45.1-01-win64\nexus-3.45.1-01\bin目录中的nexus.exe就是启动器。在项目的pom.xml中添加私服的上传路径(这里的id应该与上述setting.xml中的id保持一致,name可以随便取)若私服不允许匿名访问,则需要在setting.xml中再添加一下用户登录信息(这里的id需要跟上面截图中的保持一致)在setting.xml中添加私服路径(id和name可以随便取,url从私服获取)

2024-03-28 15:25:18 630

原创 【jenkins+cmake+svn管理c++项目】jenkins回传文件到svn(windows)

在经过cmake+msbuild顺利生成动态库之后,考虑到我一个项目可能会生成多个动态库,它们分散在build内的不同文件夹,我希望能将它们收拢到一个文件夹下,并将其回传到svn。

2024-03-27 19:19:43 1327

原创 【剑指offr--C/C++】JZ22 链表中倒数最后k个结点

法2:设置前后两个指针,先让一个指针走k步的距离为k(如果这个过程中已经走到链表末尾,那么直接返回空),然后同步进行遍历,这样等前面的指针走到结尾的时候,后面的指针正好是倒数第k个节点。法1:先遍历一遍获取size ,在遍历一遍获取第(size-k)个节点返回。遍历链表并存入vector容器,通过下标取出对应位置元素或者返回空。

2024-03-26 22:03:45 235

原创 【剑指offr--C/C++】JZ23 链表中环的入口结点 与哈希表

unordered_set是一种无序的数据集合容器,元素和键同时存在,元素没有按任何特定的顺序排序,而是根据它们的散列(hash)值组织成桶,以允许直接通过值快速访问各个元素(平均时间复杂度是O(1))。一、哈希表(unordered_set)知识点。

2024-03-26 21:40:37 312

原创 【jenkins+cmake+svn管理c++项目】创建一个项目

我是第二种其效果,修改之后记得运行jenkins.exe stop 、jenkins.exe start 命令重新启动一下服务。点击保存之后,在左侧点击Build now, 然后在下边构建过程进度条那里点击“×”或“√”图标可以查看控制台信息。工作台点击"新建item",进入下图,选择Freestyle project,并输入项目名称,点击确定之后进入项目配置页面,填写描述,然后在下边源码管理部分选择svn, 填写代码的url。然后继续,选择构建环境,和编译步骤。

2024-03-26 16:48:43 513

原创 【jenkins+cmake+svn管理c++项目】windows修改jenkins的工作目录

由于jenkins会拉取大量的源代码以及编译生成一些文件,我希望我能自己指定目录作为它的工作空间,放在这里显然不太合适。

2024-03-26 16:10:07 387

原创 【jenkins+cmake+svn管理c++项目】Windows环境安装以及工具配置

从官网下载适合windows系统的安装包,我下载的是最新版的2.426.3 msi文件,这个版本支持的JDK版本是11/17。另外,如果编译完成之后要将内容回传到SVN,需要SVN Publisher plugin插件,这个插件可能在jenkins的插件管理里边找不到,找不到的话就需要自己去找资源下载,是一个。这里有一点问题:我使用先stop再start的方式配置生效,直接restart反而不生效,甚至之前生效的配置也报错了。部分,在其中的部署插件部分,选择你下载好的hpi文件上传就可以了。

2024-03-26 15:34:46 1529

原创 windows系统通过命令行调用cmake和vs编译c++项目

一般我们在`linux`使用:`cmake..;make;`命令调用gcc来编译程序,在`windows`上使用cmake的客户端生成`sln`,再启动VS读取sln编译程序。但是我要用jenkins来管理c++构建,那么就需要在windows环境也能通过命令行来调用cmake。环境: win10虚拟机, VS2017, cmake3.19.4。

2024-03-25 17:49:14 326

原创 cmake与交叉编译(x86 to arm)过程和问题全记录

can’t find “/lib64/libharfbuzz.so” basic_ostringstream未定义的引用 libc.so 未定义的引用 listdc++.so可以直接通过替换动态库文件来升级版本;但是libc.so不能简单替换,由交叉编译工具的制作过程可知,gcc与glibc是强关联的。

2024-03-20 16:47:06 1075

原创 【剑指offer--C/C++】JZ25 合并两个排序的链表

我这里是设置将两个链表拆开组成一个新的链表,这样不需要占用新的空间。两个指针对应节点的值进行比较,那个节点值较小,就将这个节点拿下来放到新链表的末尾(想象拆两条手链),另一个链表不动,这样一轮下来就能按大小顺序将节点依次拆开组成一个新的链表。我上面的pHead3==NULL部分的逻辑是为了通过比较来获取链表的第一个元素,因为第一个元素跟后面的不一样,不能统一用next。只需要返回的时候再把添加的这个表头去掉就可以了,很妙,记录一下。

2024-03-17 18:20:39 729

原创 【剑指offer--C/C++】JZ24 反转链表

三个指针,分别指向:当前节点、前一个节点、后一个节点。通过指针的辅助使得当前节点的next指向前一个节点,这样遍历完一遍之后所有的next全部翻转指向其前一个节点。遍历一轮,将节点依次压入栈,然后从栈顶依次取出节点,并另上一次取出节点的next指向当前取出的节点,最后记得将最后一个节点的nxet指向NULL。

2024-03-17 17:07:44 564

原创 【剑指offer--C/C++】JZ6 从尾到头打印链表

先遍历链表,以此存到vector中,然后定义两个指针,分别从头部和尾部同时往中间遍历,并将相应的位置进行交换,直到两个指针相等或后面的指针小于前面的。例如{1,2,3,4,5} --> 1和5交换,2和4交换。在函数外部声明, 即把ret声明为Solution类的一个公有变量. 从而函数每次直接调用ret执行操作即可, 不需要在每一层递归都声明一个新的ret.先遍历链表,以此存到vector中,然后再从后往前遍历这vector,存入到一个新的vector,就完成了翻转操作。

2024-03-07 20:04:19 419

原创 【剑指offer--C/C++】JZ3 数组中重复的数字

这道题目它要求的时间空间利用率都是n,那么可以考虑创建一个长度为n的数组repeat初始化为0,下标代码出现的数字,下标对应的数组内容代表该下标数字出现的次数。然后遍历提供的数组,每出现一个数字,就去repeat数组下标对应位置内容+1,然后判断如果已经>1了,那说明重复了,直接返回这个下标数字即可。编译报错说是numbersLen是一个会变的数字,不能用它作为数组长度,可是,当运行到这个子函数内部并创建数组的时候,numbersLen不是一个已知的且在子函数退出之前固定不变的数吗?

2024-03-03 22:22:37 401

原创 Android Studio开发之路(七)CameraX&&Opencv的使用

我需要将每一帧处理后的图像想普通相机那样再显示在界面上,但是CameraX的分析用例没有提供返回,而且要将mat再转回也比较麻烦,所以普遍的方式是在预览界面的上面再叠放一个ImageView,每处理一帧就用ImageView显示出来。(根据我的目标,我只要显示处理之后的帧,所以我干脆没有使用预览用例)。原本是调用opencv-android里边的JavaCamera2View来实现,这个用起来比较方便,它提供了集成好的相机预览界面,并且提供了帧处理函数。这里还要注意显示的大小。:提供每一帧图像用于处理。

2024-01-17 11:27:46 1184

原创 Android Studio开发之路(六)(合集)界面优化以及启动图标等

android提供的ActionBar文字偏左,想要居中,于是自定义一个标题栏。自定义标题栏。

2023-12-20 12:06:42 1151

原创 C++ STL 迭代器失效

上面这段代码就是在下标为4的位置插入一个元素8,插入之后vA内部就应该是{0,10,22,33,8,40},迭代器的位置没有发生变化,那它指向的位置就是元素8所在的位置,以上逻辑看似没什么问题,但是在有些编译器里是编译不通过的,这是为什么呢?如上述代码,当使用vA[6]的方式出现访问越界时,依然能得到一个结果,而使用at(6)的方式时程序就会抛出一个数组越界的异常,所以为了及时发现程序错误,访问容器内容时推荐使用at()的方式。【注:无论是插入和删除,it指向的位置始终没变,只是相应位置的元素发生了变化】

2023-11-05 14:39:50 206

原创 UOS QTextEdit设置换行和滚动条(bug自动换行时右侧个别字符被遮盖)

这个问题也好解决,设置一下滚动条的样式就可以,不过不知道为什么我在ui界面上修改样式表不起作用,最后是通过代码修改成功的。

2023-09-21 17:21:49 988

原创 Android Studio开发之路 (五)导入OpenCV以及报错解决

这里一个简单的解决办法是:将:app的build.gradle中的namespace 语句复制到opencv的build.gradle中。不过需要注意的是,我是重新建了一个项目,修改了这两个参数之后再重新引入opencv才成功的,在上面报错的时候直接修改是不行的。4.加载完成之后看下图,需要修改加载进来的openCV文件夹下面的build.gradle中的一些内容,首先。这个真的折磨了我很久,按别的博主说的org.opencv.engine路径配置不对啥的,完全不解决问题。二、过程中报错以及修改。

2023-08-25 09:52:13 2214 6

原创 multiple definition of......first defined here

原本在centos6-x86-gcc7.5.0上面进行编译非常的顺利,但是拿到麒麟arm上面编译就提示了这个错误:这个报错的意思就是说: opencv中有一些变量和函数多次定义,第一次是出现在freeimage里面。仔细想想,这两个系统编译的差别,很明显的一个就是gcc的版本不一样,7.5版本通过了,7.4版本没通过。查了一些资料,大多是说变量和函数被重复定义了,或者说没有添加条件编译的代码,但是这些显然不匹配我的报错,因为我的是两个流传甚广的第三方库,也已经在环境里使用了挺长时间了。

2023-08-16 17:45:12 366

原创 gcc 命令添加第三方依赖库

要编译一个小的测试程序,其中用到了boost库,编译时需要添加上依赖。报错如下

2023-08-16 16:26:24 391

原创 linux c++ 根据进程名杀死一个进程

目前我查到的信息来看,没找到一个封装好的c++函数可以让我们方便得得到一个进程得运行时长,linux中普遍是通过ps命令来获取到进程的开始时间和运行时长。所以在c++中通过代码来启动命令行来得到结果并将获取到的时间变成总秒数。(所谓的进程名就是执行的程序的名字,一个程序可以同时有多个进程去运行,所以一个名字可能对应多个进程pid)所以可以通过遍历/proc/下所有文件夹中的status的方式获取到该进程名对应的所有进程pid。:文件中第一行标明了该进程对应的进程名。exe:是该进程所运行的程序的软连接;

2023-07-17 17:01:21 992

原创 linux c++ 根据进程名和进程pid获取进程的运行时长

目前我查到的信息来看,没找到一个封装好的c++函数可以让我们方便得得到一个进程得运行时长,linux中普遍是通过ps命令来获取到进程的开始时间和运行时长。所以在c++中通过代码来启动命令行来得到结果并将获取到的时间变成总秒数。逻辑:1.启动上述命令获取时长;2. 将的得到的时长各部分切分开存入vector;3.将各部分都转成int比昂相加得到总的秒数。

2023-07-17 16:51:16 710

原创 error: undefined symbol: _ZN5boost6locale4util17get_system_localeB5cxx11Eb

那么原因就找到了,因为在别的CMakelist.txt中有链接boost库的操作所以在cmake编译的过程中可以看到boost出现,但是生成libYeecohImageKit.so的Cmakelist中把这两句注释掉了,所以这个库就没有正确的链接boost库,在运行的时候就找不到对应的定义。查了一些别的帖子说是这个boost::locale库没有正确链接,但是我看了cmke编译的过程,boost/locale.hpp有正确读取到,那为啥到了运行的时候就找不到了呢?将这几句代码取消注释,正确运行了~

2023-07-12 10:27:36 268

原创 Android Studio开发之路(四)okhttp访问服务器解决的报错们

`No Network Security Config specified, using platform default` `FATAL EXCEPTION: OkHttp Dispatcher` 更新UI

2023-06-02 18:20:43 526

原创 Android Studio开发之路(三)拍照以及保存图片功能

【代码】Android Studio开发之路(三)拍照以及保存图片功能。

2023-05-30 11:37:01 1642 3

原创 Android Studio开发之路(三)Button控件

【代码】Android Studio开发之路(三)Button控件。

2023-05-23 11:30:47 287

原创 Android Studio开发之路(二)添加图片资源

第二步:右键点击项目的res->drawable目录,选择paste粘贴。然后就可以看到在drawable目录下出现了复制的图片。然后在xml中添加代码就可以显示在界面上了。问你是否确定要复制,点击ok即可。第一步:复制要添加的图片。选择drawable目录。

2023-05-22 14:27:50 6083 1

原创 Android Studio开发之路 (一)开发环境搭建以及问题记录

然后我有回到报错的地方观察发现,每一个android版本的开头都有一个下载按钮,于是我点击这个下载(我下载了7.1.1版本),下载完成之后这个版本的下载按钮就消失了,也可以正常选择了,所以需要哪个版本点击下载就可以啦,问题解决啦~我这个版本是点击"OK"它自己就会安装了,如果没有自动安装的话,可以点击tools---->SDK MAnager 中找到这个东西安装(如下图),注意路径,要安装在AndroidSDK下面。我的虚拟手机终于启动啦,HelloWorld也成功了,

2023-05-18 16:34:27 1104

原创 gcc编译与交叉编译(x86 to arm) (二)编译静态库和动态库

编译过程如下图,g++开头的是使用本地gcc编译,aarch64-linux-gnu-g++开头的是交叉编译成arm版本,最后提示“可执行文件格式错误”,就是因为它交叉编译生成的arm架构,在x86上自然不能执行,我们也可以。四个程序文件:main.c、function.h、greeting.c name.c。用例程序文件跟静态库一样,命令如下。

2023-05-17 14:50:15 1600

原创 gcc编译 与交叉编译(x86 to arm) (一)单个文件编译

运行上面的命令,就可以生成hello_arm的可执行程序,运行发现它在当前的x86下不能运行,拿到arm就可以成功输出hello world!,下载之后将其解压这个目录下面,会看到解压出的文件夹里包括了一堆文件夹,是arm的一些底层文件,其中bin文件中存在一个。然后再末尾将上面解压的路径添加到PATH:(i: 进入编辑;:wq 保存并退出)回车,如果这个交叉编译链可以成功起作用,就会加载出一堆信息,包括版本信息。方法:使用现成的交叉编译工具链。以上两个均可以下载,我下载的是。文件,是我们的交叉编译工具。

2023-04-24 17:41:39 1231

原创 uos_arm 安装qt以及 unknown module(s) inQT: svg

遇到的第一个bug:unknown module(s) inQT: svg。这里我只进行了第一步,也就是安装成功5.11.3,没有继续安装5.12。没有安装svg模块;我根据下面的链接,安装了一下svg的模块就好了。

2023-04-23 11:50:36 373

原创 《C++编程思想(两卷合订版)》第二章课后练习作业记录

C++编程思想(两卷合订版)》第二章课后练习部分题目作业记录。(工具:VS2019)

2023-01-06 15:15:18 129

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除