![](https://img-blog.csdnimg.cn/20201014180756754.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
算法
cafe-BABE
嵌入式
展开
-
【算法】k个一组反转链表
题目(leetcode25)思路:思路:就是一轮一轮的反转一部分链表,里面主要使用四个指针:pre,start,end,next,意义如下:原创 2020-10-24 13:52:47 · 192 阅读 · 0 评论 -
【算法】二叉树的最大路径和
二叉树的最大路径和(困难)本题中,路径被定义为一条从树中任意节点出发,达到任意节点的序列。该路径至少包含一个节点,且不一定经过根节点。里面的节点的值可能为负。链接-leetcode124如下图:思路:有一些类似的题目,比如从一个二叉树里面的任意一个节点出发,只能往下,然后求最大的路径和或者是最大的异或和,这道题不同的地方在于,它既可以网上,也可以往下。另外,也有类似的题目是求一个二叉树里面的最长路径,而不是最大路径和。这里我们假设一下,如果我们知道了每个节点往下的最大路径和(注意,往下不一定非要原创 2020-10-09 16:20:27 · 968 阅读 · 0 评论 -
网易互娱笔试2:简化版文件系统
图片来源网上。例子:输入:210open libc.soopen libm.soopen libdl.sodup 2dup2 0 2close 0query 1query 2query 3open log.txt10open output.txtdup2 0 1000000close 0open output2.txtdup2 0 100000close 0open 1.txtdup 100000query 1query 0...原创 2020-09-28 10:30:15 · 316 阅读 · 0 评论 -
网易互娱笔试1:蛇形矩阵
全A。定义N维蛇形方阵的生成方式如下,把1~N^2依次填入正方形矩阵中,首先从最外圈开始填写,最外圈是顺时针方向,然后依次填写内圈,第一层内圈反过来变成逆时针方向,然后再反过来变成顺时针方向。如下所示,打印一个7阶的蛇形矩阵: 0 1 2 3 4 5 6 23 24 39 38 37 36 7 22 25 40 41 42 35 8 21 26 47 48 43 34 9 20 27 46 45 44 33 10 19 28 29 30 31 32 11 18 17 16 1原创 2020-09-28 09:41:00 · 456 阅读 · 0 评论 -
【算法】最长公共子序列
题目:给定两个字符串 text1 和 text2,返回这两个字符串的最长公共子序列的长度。一个字符串的 子序列 是指这样一个新的字符串:它是由原字符串在不改变字符的相对顺序的情况下删除某些字符(也可以不删除任何字符)后组成的新字符串。例如,"ace" 是 "abcde" 的子序列,但 "aec" 不是 "abcde" 的子序列。两个字符串的「公共子序列」是这两个字符串所共同拥有的子序列。若这两个字符串没有公共子序列,则返回 0。思路:使用动态规划,dp[i][j] 的含义是:对于 s1原创 2020-09-24 19:19:46 · 413 阅读 · 0 评论 -
使用“开放地址法”实现hashmap
之前的博文中提到了使用拉链法来实现hashmap,本以为掌握了手撕“拉链法”的哈希表已经不错了,没想到今天遇到了要求:使用开放地址法实现哈希表。虽然说最后还是写出来了,但是当时写的代码实在是“又臭又长”,很多地方不够精简,虽然也许能够实现相同的功能,但是可读取比较低。首先本题要求的开放地址很简单,就是如果出现了哈希冲突,那就看下一位行不行,如果不行,继续往下,并且本题不要求写出resize和rehash方法。就假设hashmap是定长的,如果超出了长度要求就直接抛出异常。我之前写的代码存在的问题:原创 2020-09-11 21:17:36 · 826 阅读 · 0 评论 -
【算法】打印回文矩阵
n=1,2,3,4,,时打印类似于下面这样的回文矩阵: public static int start=1; public static void process(int n){ int[][] arr1=new int[n][n];//左上角矩阵 int tr=0,tc=0,br=n-1,bc=n-1; while(tr<=br&&tc<=bc){ process(arr1,tr++,tc++,br--,bc--); } in原创 2020-09-10 20:45:08 · 465 阅读 · 0 评论 -
算法:完美排列
将某些玩具从左到右的固定排列可以增加客流量,将这种排列称为完美排列。现在店员记录下了玩具店里面N个玩具的排列顺序,现在想让你帮忙找找这个排列里面有没有完美排列。如果有,返回最先出现的下标(下标从1开始计算),如果没有,返回0。输入:第一行一个整数K表示完美排列的长度第二行K个整数Ai,表示完美排列从左到右的外观值第三行K个整数Bi,表示完美排列从左到右的价格值第四行一个正整数N,表示当前玩具店里面排列的玩具数量第五行N个整数Ci,表示玩具店里从左到右的外观值第六行N个整数Di原创 2020-09-14 17:43:26 · 590 阅读 · 0 评论 -
算法:一个二维矩阵表示岛屿,上面的数值代表高度,找出下雨时可以形成的最长路径,返回最长长度
一个二维矩阵表示岛屿,上面的数值代表高度,找出下雨时可以形成的最长路径,返回最长长度,没经过一个点长度都加1,对于每个位置都可以走上,下,左,右四个位置。例子:8 4 16 5 2对于上面这个矩阵,最长路径为5,可以为8->6->5->4->1或者8->6->5->2->1。思路,类似于岛问题,但是这里需要注意的是,这题根本不需要考虑“反复进入同一个位置”的这些情况,也就是不需要visited数组来记录哪些节点已经到过,因为原创 2020-09-14 17:43:16 · 352 阅读 · 0 评论 -
算法:给一个二叉树,每个节点都有权值,你可以从这个树的节点往下走,到任意节点停止,你得到的分数是走过路径上的权值的异或和
给一个二叉树,每个节点都有权值,你可以从这个树的节点往下走,到任意节点停止,你得到的分数是走过路径上的权值的异或和,求可以获得的最大分数。输入:第一行包含一个整数N,表示节点的数量,接下来N行每一行都有四个值,节点id,节点的权重,左节点id,右节点id。如果左右节点id=-1,表示没有子节点。输出,可以获得的最大分数。例子:51 1 2 32 4 -1 -13 2 -1 44 5 -1 55 3 -1 -1输出:7思路:这题和在二叉树里面选取一段路径,求路径和等原创 2020-09-09 22:13:32 · 2718 阅读 · 0 评论 -
腾讯笔试4:求字符串出现次数的最多和最少的k次
输入:4 21234解释:4表示接下来输入4个字符串,2表示我们要找出现次数前2多和出现次数前2少的字符串,如果次数相同,根据字典序排序,字典序小的放前面。然后下面的每一行都是输入的一个字符串。因此输出为:1 12 11 12 1思路,本来遇到这种topk的自然想到小跟堆,但是最后输出是要按照出现次数进行排序的,小跟堆只能做到输出最大的k个,但是这k个并不会给你排好序,所以我就老老实实使用Arrays.sort()了,就是复制一下数组,然后分别应用两个比较器,一个比较器原创 2020-09-07 10:10:15 · 525 阅读 · 0 评论 -
腾讯笔试3:偶数个数字里面删掉一个数之后的中位数是什么
输入:N3 4 1 2 6 5 8 7解释:N表示接下来输入的数字的个数(N一定为偶数),然后下一行是输入的数字序列,然后我们要输出删除每个位置的元素之后,剩余的N-1个元素的中位数是什么(N-1一定是奇数)。思路:首先排序,但是不能在原数组上面排序,需要复制一个数组进行排序,排完序之后,比如上面就是:1 2 3 4 5 6然后我们找到靠近中间的两个数:3(叫做min)和4(叫做max),然后,假如需要删除 1或者2,剩下的中位数都是4,加入我们要删除5或者6,剩下的中位数都是3..原创 2020-09-07 09:56:21 · 368 阅读 · 0 评论 -
腾讯笔试2:通知的互相传递
输入:N M3 5 6 10 12 4 73 8 9输入的N表示一共有几个人(话说这个参数我好想没用到),M表示一共有几个小团体,下面的M行就表示每个小团体里面的人的编号,比如3 5 6 1就表示第0个小团体里面有编号3 5 6 1的人。每个人可以分属于几个不同的团体或者不属于任何团体一开始会向编号为0的人传达一个消息,然后0会把这个消息传递到所在组里面的每个人,每个人又会传递给他的组里面的每个人,求最后一共有多少人知道这个消息。思路1:最朴素的思想,我们建立一个idse..原创 2020-09-07 09:47:10 · 232 阅读 · 0 评论 -
腾讯笔试1:两个链表求公共部分(交集)
思路:这题就是双指针,然后如果指针A和指针B所指向的数据是一样的,就一起往后跳,如果不相同,比如A指向的数据大,就把A指针向后移动,如果B指向的数据大,就把B向后移,while 的条件是A和B都没到达链表的结尾。代码如下:static class ListNode { int data; ListNode next; ListNode(int val) { this.data = val; } }原创 2020-09-07 09:31:38 · 446 阅读 · 0 评论 -
招银笔试编程:检测从起点出发的可能环路
比如系统里面有五个服务节点(节点编号0~4),用五阶矩阵A表达各个服务之间的关联关系,0表示无法访问,1表示有访问,比如下面:{0,1,0,0,0}{0,0,1,1,0}{1,0,0,0,0}{0,0,0,0,1}{0,1,1,0,0}A[0][1]=1,表示节点0会调用节点1;A[4][0]=0,表示节点4不会调用节点0;将矩阵画出之后,可以观察到从服务4出发,存在环:4-1-3-44-2-0-1-3-4请编程满足一下输入:M0 1 0 0 0 0 0 1 .原创 2020-09-06 16:27:40 · 727 阅读 · 0 评论 -
求 1 到最大的 n 位数
输入数字n,按顺序打印出从1到最大n位的十进制数字,比如输入3,打印1,2,3,4,,,一直到最大的三位数即999。思路,这题看上去不难,但是需要注意的有两点,首先如果n位数很大,超出了int或者long表示的范围怎么办,因此我们选择把数字存放在数组里面,然后使用全排列的类似方法来求出n位数的所有可能性。第二个需要注意的是打印的时候,最前面的0是不用打印的,直到遇到第一位不是0的数我们才打印。 public static void process(int n){ int[] arr原创 2020-09-05 21:09:16 · 581 阅读 · 0 评论 -
bilibili笔试:给定一个由若干个0和1组成的数组A,我们最多可以将K个值从0变成1,返回仅包含1的最长连续子数组的长度。
比如,输入:1,1,1,0,0,0,1,1,1,1,0输出:6。只要将第三个0和第四个0变成1即可。思路:回溯,尝试将每个0变成1,一旦将k个0变成1,或者到达字符串的结尾,就开始统计连续的1的子数组的最大长度。public static int max=0; public static void process(int[] arr,int index,int k){ if(k==0||index==arr.length){//如果已经将k个0变成1了,或者到达了字符串末尾了原创 2020-09-05 17:13:37 · 5304 阅读 · 4 评论 -
百度笔试:回家有n个台阶,每次至少走一个,但是要求每步和之前两步走的台阶数目不能一样,请问有多少种不同的解法,答案对10^9+7取模。
回家有n个台阶,每次至少走一个,但是要求每步和之前两步走的台阶数目不能一样,请问有多少种不同的解法,答案对10^9+7取模。输入两个整数n,m,n表示台阶数目,m表示单步最大跨越的台阶数目。思路:老实说这题不难,但是想全A还是有点难,全A肯定要动态规划,而且是三维的动态规划,但是我觉得面试的时候也不会考这么难,所以三维的动态规划的方法就不写了,下面写了两个方法,一个是递归的,一个是记忆化搜索(带备忘录的递归)。1、递归就是递归每次需要传入上一次的值last和上上次的值lastlast,然后遍原创 2020-09-04 14:50:09 · 4517 阅读 · 4 评论 -
拼多多笔试:最大士兵问题
题目:输入一个N*M的矩阵,元素为1表示有一个士兵,元素为0表示没有士兵,如果一个士兵的上下左右相邻的士兵可以归为一个队伍,同一个队伍的士兵越多,队伍越强大,现在可以随意移动一个士兵,求移动之后可以得到的最大队伍的士兵数:比如输入:4 41 0 0 11 1 0 10 0 0 11 1 1 1输出10。思路:和岛问题很像,我当时没想出来,看了别人的思路后面补了一下,基本是按照下面来的。public static int res=0; public static i.原创 2020-09-02 10:50:34 · 990 阅读 · 0 评论 -
拼多多笔试:用米字型把N阶矩阵分成8个区域,然后给每个区域编号为1,2,3,,8
题目:对于一个n阶矩阵,用米字型分割线把矩阵等分成8个区域,然后从右上角开始,按照逆时针方向给哥哥区域编号为1,2,3,,8,如下图:矩阵元素需要满足:1、各区域内的元素值等于区域的编号2、被分割线穿过的区域等于0比如输入4,输出:0 2 1 03 0 0 84 0 0 70 5 6 0输入6,输出0 2 2 1 1 03 0 2 1 0 83 3 0 0 8 84 4 0 0 7 74 0 5 6 0 70 5 5 6 6 0思路:这题我当时想复杂了原创 2020-09-02 10:02:19 · 474 阅读 · 0 评论 -
“回溯”相关题型
1、符串全排列问题打印一个字符串的全排列(比如abc的排列包括:abc,cab,cba,,,,),剑指offer38又或者,给一串数字,求这串数字的全排列,比如:leetcode46思路1、首先可以分成两种情况:一种是里面没有重复的字符,一种是有重复的字符(只需要加一个hashset,每次查看需要交换的在set里面是不是已经存在)。整体的结构是:交换其中某两位,然后继续递归后面的,然后在交换回来(恢复交换的 元素),准备迎接下一轮。过程就如下图所示:public ArrayList<St原创 2020-08-30 11:09:33 · 184 阅读 · 0 评论 -
阿里笔试:对于一个01字符串,每次只能任意交换两个元素,或者把0变成1,或者把1变成0,或者反转整个字符串。那么从A串变成B串至少需要多少步。
题目:对于一个01字符串,每次只能任意交换两个元素,或者把0变成1,或者把1变成0,或者反转整个字符串。那么从A串变成B串至少需要多少步。例子,1111000变成0010011至少需要3步。思路1:首先可以分成两种情况,一种是反转,一种是不翻转。那么如何决定到底反转不翻转?可以比较不翻转时相同的位数,和翻转之后相同的位数,如果不翻转之前相同的位数多,那么反转显然是划不来的,如果反转之后相同的位数多,那么自然要选择反转。(反转可以使用StringBuilder的reverse)。然后比较上一次操作之后原创 2020-08-28 21:56:41 · 4784 阅读 · 6 评论 -
动态规划典型题之“买卖股票”系列
买卖股票系列题目1(简单)、给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。如果你最多只允许完成一笔交易(即买入和卖出一支股票一次),设计一个算法来计算你所能获取的最大利润。来自leetcode121,链接思路1:暴力法需要两轮遍历,外层遍历买入,内层遍历卖出,因此时间复杂度O(N^2)。思路2,只需要一层遍历,同时更新最小值以及利润最大值。因此需要两个变量保存最小买入价格和最大利润。时间复杂度降为O(N);public int maxProfit1(int[] prices)原创 2020-08-16 09:05:51 · 593 阅读 · 0 评论 -
动态规划典型题之“目标和”
题目给定一个非负整数数组,a1, a2, …, an, 和一个目标数,S。现在你有两个符号 + 和 -。对于数组中的任意一个整数,你都可以从 + 或 -中选择一个符号添加在前面。返回可以使最终数组和为目标数 S 的所有添加符号的方法数。来自leetcode494,题目链接点击这里 。 例子[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GW7IUeJd-1597239572304)(https://raw.githubusercontent.com/117125731原创 2020-08-12 21:40:13 · 433 阅读 · 0 评论 -
利用异或来交换数组元素
一般的排序算法中的用于交换数组里面两个位置元素的swap函数都要使用一个temp变量作为中转,但是利用异或,可以实现无需中转变量即可完成元素的交换,其中的原理基于以下:假设两个数a和b,将a异或b的值记做temp,即:temp=a^b;那么temp^a的值为b,并且temp^b的值为a。也就是说:将两数异或的结果与其中一数再进行异或,可以得到另一个数。根据这个定理,我们可以将temp的值直接保存在其中一个数组元素里面,从而实现不借助中转变量的数组元素交换。public class原创 2020-05-28 15:37:04 · 1103 阅读 · 0 评论 -
牛顿法,G-N法,L-M法,Dogleg法(网址整理)
转载地址:牛顿法高斯牛顿法L-M法信赖域信赖域+L-M狗腿法:第一篇 第二篇 第三篇卡尔曼滤波转载 2019-07-04 15:27:31 · 2579 阅读 · 0 评论 -
Dogleg法(狗腿法)的推导与步骤
看SLAM视觉十四讲的时候了解到了信赖域法(Trust Region)的其中一种叫Dogleg,然而上网找了一圈,发现并没有较为详细的推导,自己整理了一下网上的资源,然后详细的推了一下: 首先L-M法是G-N法与最速下降法的混合形式,通过调整阻尼因子来在这两种方法之间切换,而狗腿法类似,只不过它是通过改变信赖域来实现的。这里可以分为两个问题:如何判断是使用G-N法还是最速...原创 2019-07-04 20:15:47 · 14309 阅读 · 1 评论 -
g2o使用总结
从零开始一起学习SLAM | 理解图优化,一步步带你看懂g2o代码从零开始一起学习SLAM | 掌握g2o顶点编程套路从零开始一起学习SLAM | 掌握g2o边的代码套路部分内置定点和边的使用方法...转载 2019-07-15 10:42:19 · 826 阅读 · 0 评论 -
imshow()不显示图片
在opencv中如果想显示图片,在调用了imshow函数之后,需要再调用waitKey( )函数才能显示图片,其会指定显示图片的时间(毫秒)。如果不调用该函数,则图片不会被显示。如waitKey(0)会一直显示图片,直到按下任意键。waitKey(25)会显示图片25ms,之后会自动关闭(如果在读取视频的循环中调用,则会按帧显示视频)。 可以使用cv.de...转载 2019-07-15 15:59:48 · 2965 阅读 · 0 评论 -
视觉SLAM十四讲全部章节答案(更新中)
更新中:第七章答案1第七章答案2第八章答案第十章答案十一章答案十三章答案:https://blog.csdn.net/u012348774/article/details/84568737 https://blog.csdn.net/u012348774/article/details/84568994...原创 2019-07-15 17:05:53 · 2508 阅读 · 0 评论 -
SLAM用到的理论的网址整理
OpenCV中Mat的完整使用介绍:https://www.jianshu.com/p/883684519e80OpenCV官方文档:https://docs.opencv.org/3.3.0/annotated.htmlEigen库官方文档:http://eigen.tuxfamily.org/dox/classEigen_1_1ArrayBase.html#af01e9ea8087e3...原创 2019-07-22 20:43:47 · 3272 阅读 · 0 评论 -
对于LM法和信赖域的理解
最近在看视觉SLAM十四讲,里面的L-M(Levenberg-Marquadt)法看了很久也是一知半解,于是在网上找了很多资料,现在整理一下。 首先是我对于书上某些部分的疑问:前面的算法流程里面给出的信赖域半径和拉格朗日乘数法里面的是什么关系,书中并没有给出(我的想法是倒数关系)。 然后来说一下我的理解,首先L-M法之所以看起来很乱,是因为它可以从两个角度来解释,一个是...原创 2019-07-04 11:14:44 · 3958 阅读 · 3 评论