![](https://img-blog.csdnimg.cn/20201014180756930.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
软件设计师
First Snowflakes
捡贝壳
展开
-
顺时针打印个数组
顺时针打印个N*N数组: code:Just like state machine.#include <thread>#include <mutex>#include <list>#include <cstdlib>#include <iomanip>#include <iostream>#include <vector>using namespace std;enum Dir {原创 2022-05-22 10:54:23 · 126 阅读 · 0 评论 -
Combination Sum
Solution1:State Space TreeFirstly, we find all combitions that contain only one element. For example, if the candidates is [2,3,5], they are three combination: [2], [3], [5]. If the sum of a combination is equal to target, we store this combin...原创 2022-03-25 20:12:57 · 511 阅读 · 0 评论 -
数组中和最大的连续子数组
给定一个数组array,求其连续子数组,该子数组的元素和最大。Method1: 暴力搜索int FindGreatestSumOfSubArray(vector<int> array) { const int sie = array.size(); if(size<1){ return -999999999; } int maxSum = array[0];原创 2022-03-10 21:27:39 · 7700 阅读 · 0 评论 -
Implement Queue with 2 stack
Assuming we have two stack, st1 and st2. Just put new data into st1. When get data, if st2 is empty, we pop all data in st1 and push them into st2, if st2 is not empty, just get the top data in st2.class myQue {public:#define Empty -999 void pus...原创 2022-01-20 20:54:37 · 410 阅读 · 0 评论 -
一个开源rpc lib
https://github.com/carla-simulator/rpclibrpclib is a RPC library for C++, providing both a client and server implementation. It is built using modern C++14, and as such, requires a recent compiler.该开源库被carla项目使用: GitHub - carla-simulator/rpclib: rpcli.原创 2021-10-06 20:42:57 · 548 阅读 · 0 评论 -
求最长的连续元素序列的长度
给定一个无序的整数类型数组,求最长的连续元素序列的长度。eg:给出的数组为[100, 4, 200, 1, 3, 2], 最长的连续元素序列为[1, 2, 3, 4]. 返回这个序列的长度:4需要给出时间复杂度在O(n)之内的算法.方法:借助额外空间哈希表,两次遍历。int findLongest(vector<int> vec) { const int len = vec.size(); if (len < 1) return 0; if (len...原创 2021-05-11 11:04:51 · 325 阅读 · 0 评论 -
求解两个字符串的最长公共子序列
给定两个字符串,求解这两个字符串的最长公共子序列(Longest Common Sequence)。比如字符串1:BDCABA;字符串2:ABCBDAB则这两个字符串的最长公共子序列长度为4,最长公共子序列是:BCBA, (不要求连续)动态规划假设给定的两个字符串为strA, strB, 令二维数组c[i,j]表示子串"strA[0], strA[1]......strA[i-1]" 与子串"strB[0], strB[1]......strB[i-1]"的最长公共子序列的长度,即 i,...原创 2021-05-10 18:00:33 · 2035 阅读 · 2 评论 -
找出最长无重复字符的子串
给定一个字符串,请你找出其中不含有重复字符的最长子串的长度。https://leetcode-cn.com/problems/longest-substring-without-repeating-characters/示例 1:输入: s = "abcabcbb"输出: 3解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。示例 2:输入: s = "bbbbb"输出: 1解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。示例 3:输入: s..原创 2021-04-21 18:44:37 · 936 阅读 · 0 评论 -
LinkedHashMap
无序的hashMap可以用来存储键值对,将一个键值对存入map的过程一般是,首先,对key做哈希运算,例如取余数,得到一个哈希值,然后将该值作为一个地址,例如数组的索引值,然后,将key-val这个pair放入该地址位置。现在需要map有记录存入顺序的功能,例如,存入(1-3),(8-4),(3-0),然后可以按照这个存入的顺序遍历出所有节点。同时保证存取操作的时间复杂度不变。方法一:用双向链表将存储的各个key-val对串起来:https://blog.csdn.net/qq_40050586原创 2021-04-15 17:23:53 · 130 阅读 · 0 评论 -
unix文件路径简化
描述:https://leetcode-cn.com/problems/simplify-path/以 Unix 风格给出一个文件的绝对路径,你需要简化它。或者换句话说,将其转换为规范路径。在 Unix 风格的文件系统中,一个点(.)表示当前目录本身;此外,两个点 (..) 表示将目录切换到上一级(指向父目录);两者都可以是复杂相对路径的组成部分。请注意,返回的规范路径必须始终以斜杠 / 开头,并且两个目录名之间必须只有一个斜杠 /。最后一个目录名(如果存在)不能以 / 结尾。此外...原创 2020-12-03 23:02:34 · 814 阅读 · 0 评论 -
判断二叉树是否是对称的--以根节点的中线为轴
描述:请判断一个二叉树是否是对称的(以根节点的中线为轴), 例如,如下的则是对称的:方案1:基于循环法进行树的广度优先遍历,左右子树分别单独遍历,并将节点保存到vector中. 对于左子树的各个层,我们总是先访问左侧的节点, 对于右子树的各个层,我们总是先访问右侧的节点。最后比较左右子树的vector中的元素是否对应相等.如果树是对称的,则必定相等。缺点是: 需要额外的空间较多。首先,树的广度优先遍历使用了queue, 然后为了保存节点,使用了vector。引申:对于左子树进行 ...原创 2020-11-30 00:04:20 · 547 阅读 · 0 评论 -
生成特殊数组 4度斜线递增
给定数组的长rowNum和宽coluNum,生成如下的数组:思路1:--尚未code,思路2更好。1)计算总共有多少斜线2)计算每一条斜线的起点在数组的哪个位置,以及起点的元素大小,以及该斜线上有几个元素。思路2: 蔓延法。从左上角开始,一个一个设置数组的值,设置完一个后,从当前位置沿着指定方向 (例如右上方)前进到下一个位置, 能达到的话,则设置,否则,开始变方向。转向时的第一个任务便是,找到新起点,,如果刚刚完成的是右上方的前进,则下一次的起点在本次的右方...原创 2020-11-15 20:27:07 · 251 阅读 · 0 评论 -
c++ 11实现一个定时器,周期性地执行指定的task
可以直接使用c++11的thread, mutex, conditon_variable来实现, 结合了std::function.Note:1)start函数,开辟一个新的线程,并detach,在这个线程中周期性地执行task。 建立一个std::thread线程时,需要传入一个可调用对象,这里使用了lambda函数,非常方便。 start函数的入参是,周期时间ms,以及一个std::function<void()>2) 使用了c++11的原子变量...原创 2020-11-15 11:16:27 · 11341 阅读 · 0 评论 -
获取队列的最大值,时间复杂度限制在o(n)
https://leetcode-cn.com/problems/dui-lie-de-zui-da-zhi-lcof/请定义一个队列并实现函数 max_value 得到队列里的最大值,要求函数max_value、push_back 和 pop_front 的均摊时间复杂度都是O(1)。若队列为空,pop_front 和 max_value 需要返回 -1.class MaxQueue {public: MaxQueue() {} int max_value(...原创 2020-11-15 10:46:28 · 655 阅读 · 0 评论 -
处理二叉树使得任何节点的右子树的最大值大于左子树的最大值
与二叉树的镜像很相似:https://blog.csdn.net/qq_35865125/article/details/79339200思路:遍历所有的节点,遍历到某个节点时,得到该节点的左子树的最大值Lmax,右子树的最大值Rmax,如果Lmax>Rmax,则交换左右子树。可以写一个函数in getMaxVal(Node* root), 返回以root为根节点的树的最大值。 另外,可以在Node结构体中怎加变量记录其子树的最大值, 在遍历节点时,采用深度优先的方法,先遍历最下...原创 2020-11-11 22:44:16 · 533 阅读 · 0 评论 -
皇位继承顺序(树的深度遍历(前序遍历))
https://leetcode-cn.com/problems/throne-inheritance/一个王国里住着国王、他的孩子们、他的孙子们等等。每一个时间点,这个家庭里有人出生也有人死亡。这个王国有一个明确规定的皇位继承顺序,第一继承人总是国王自己。我们定义递归函数 Successor(x, curOrder) ,给定一个人 x 和当前的继承顺序,该函数返回 x 的下一继承人。请你实现 ThroneInheritance 类: ThroneInheritance(...原创 2020-11-10 23:00:59 · 417 阅读 · 0 评论 -
数组的最长上升子序列
给定一个无序的整数数组,找到其中最长上升子序列的长度, 注意,并没有连续的要求。示例:输入: [10,9,2,5,3,7,101,18]输出: 4解释: 最长的上升子序列是 [2,3,7,101],它的长度是 4。说明: 可能会有多种最长上升子序列的组合,你只需要输出对应的长度即可。 你算法的时间复杂度应该为 O(n2) 。方法:https://leetcode-cn.com/problems/longest-increasing-subsequen...原创 2020-11-10 06:30:17 · 794 阅读 · 0 评论 -
字母大小写全排列
给定一个字符串S,通过将字符串S中的每个字母转变大小写,我们可以获得一个新的字符串。返回所有可能得到的字符串集合。示例:输入:S = "a1b2"输出:["a1b2", "a1B2", "A1b2", "A1B2"]输入:S = "3z4"输出:["3z4", "3Z4"]输入:S = "12345"输出:["12345"]来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/letter-case-permutation.原创 2020-11-07 22:28:16 · 420 阅读 · 0 评论 -
经典死锁问题 - 哲学家圆桌就餐
https://leetcode-cn.com/problems/the-dining-philosophers/5 个沉默寡言的哲学家围坐在圆桌前,每人面前一盘意面。叉子放在哲学家之间的桌面上。(5 个哲学家,5 根叉子)所有的哲学家都只会在思考和进餐两种行为间交替。哲学家只有同时拿到左边和右边的叉子才能吃到面,而同一根叉子在同一时间只能被一个哲学家使用。每个哲学家吃完面后都需要把叉子放回桌面以供其他哲学家吃面。只要条件允许,哲学家可以拿起左边或者右边的叉子,但在没有同时拿到左右叉子时不...原创 2020-11-05 21:37:12 · 769 阅读 · 0 评论 -
二叉树转换为链表
source: https://leetcode-cn.com/problems/flatten-binary-tree-to-linked-list/两种方法,都是基于二叉树的前序遍历,一种是递归方法(借助一个额外的vector实现节点的缓存),一种是循环方法(循环方法实现前序递归本身就需要借助stack,这里正好借助该stack作为缓存,进行转换),见代码:#pragma once#include <iostream>#include <vector...原创 2020-11-02 22:24:03 · 987 阅读 · 0 评论 -
链表 - 两两交换相邻节点的值
leetcode:https://leetcode-cn.com/problems/swap-nodes-in-pairs/MyCode: 双指针:#pragma once#include <iostream> //Definition for singly-linked list. struct ListNode { int val; ListNode *next; ListNode() : val(0), next(nu...原创 2020-11-02 08:03:47 · 235 阅读 · 0 评论 -
单向链表的反转
星链,是美国太空探索技术公司的一个项目,太空探索技术公司计划在2019年至2024年间在太空搭建由约1.2万颗卫星组成的“星链”网络提供互联网服务,其中1584颗将部署在地球上空550千米处的近地轨道,并从2020年开始工作。思路:双指针:先判断是否只有一个节点,一个的话,直接返回; 若大于等于2个节点,则启用双指针遍历,循环接续的条件是前方指针为null. 手动实现时才发现需要考虑太多细节....Code:#pragma once#include <vector>...原创 2020-10-23 07:48:19 · 127 阅读 · 0 评论 -
36辆车中找出速度最快的3辆车,每次比赛6辆车,最少几次比赛
要求:只能知道同一个小组内的车的先后排名,没有车速记录。方法:先分成6小组,记为G1--G6,进行6次比赛,每小组6辆车,得到各个小组内的排序。然后,抽出6个小组中各组的第一名(最快的车一定在其中),进行一次比赛,第一名即为所有车中最快的!假设,最快的车在G3组,然后,取G3组的第二名(前三甲有可能都在G3哦),与其他组的第一名,组成一次比赛,比赛结果的第名即为所有车中的亚军;然后,出去冠亚军车之外,取G1--G6小组中的最快的车,来一次比赛,第一名为季军。总共需要9次.原创 2020-10-22 21:38:00 · 362 阅读 · 0 评论 -
大数加法(C++实现)
https://www.cnblogs.com/-Ackerman/p/11191566.html原创 2020-10-21 23:06:51 · 651 阅读 · 0 评论 -
Find数组中出现次数超过一半的数字
描述:数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,5,4,2}。由于数字2在数组中出现了5词,超过数组长度的一半,因此输出2.思路:1)根据数组特点,数组中一个数组出现的次数超过数组长度的一半,即它出现的次数比其他所有数字出现次数的和还要多。因此,遍历数组时,保留两个值,一个是数组中的一个数字,一个是次数。 当我们遍历到下一个数字的时候,如果下一个数字和我们之前保存的数字相同,则次数加1; 如果下一个数字和我们之...原创 2020-10-21 23:03:14 · 107 阅读 · 0 评论 -
滑雪问题--动态规划-记忆搜索
题目:Michael喜欢滑雪百这并不奇怪, 因为滑雪的确很刺激。可是为了获得速度,滑的区域必须向下倾斜,而且当你滑到坡底,你不得不再次走上坡或者等待升降机来载你。Michael想知道载一个区域中最长的滑坡。区域由一个二维数组给出。数组的每个数字代表点的高度。下面是一个例子1 2 3 4 516 17 18 19 615 24 25 20 714 23 22 21 813 12 11 10 9可以从某个点滑向上下左右相邻四...原创 2020-10-21 22:51:50 · 666 阅读 · 0 评论 -
找出多个有序链表中的所有公共节点
描述:有N个单向链表,每个链表中的元素都已经按照从小到大的顺序排序。需要找出N个链表中所有的公共元素例如,给定一下三个链表时,输出2,2.1-2-2-2-3-92-2-91-2-2-100思路:类似,将两个有序链表合并成一个有序链表。 同时遍历N个链表,遍历的同时对N个正在被遍历的节点进行比较,如果发现某个链表已经结尾,则停止;否则,判断当前正在被遍历的n个节点是否相等,相等则输出该值,同时所有链表同时前进一步,否则,找出最小的节点对应的链表,并将这个链表...原创 2020-10-21 22:27:35 · 292 阅读 · 0 评论 -
交换两个变量的值,不使用额外的内存
描述:假设地址addr1中存储了一个整数a,地址addr2中存储了一个整数b,要求交换这两个值,不使用额外的内存。方法1:缺点:存在a+b,这可能导致溢出。方法2:解决上述可能的溢出问题,若a,b同符号且都不溢出,则a-b肯定不会溢出的; 若a,b异号且都不溢出,则a+b肯定不会溢出的。先判断a,b的符号,如果同号,则做一个相减动作:...原创 2020-10-07 17:41:04 · 1182 阅读 · 0 评论 -
两个线程交替打印的各种解决方法
题目:https://leetcode-cn.com/problems/print-foobar-alternately/方法1:模仿信号量机制,使用两个整数来控制先后执行顺序。class FooBar {private: int n;public: FooBar(int n) { this->n = n; } void foo(function<void()> printFoo) { for (int i = 0; i < n;...原创 2020-09-28 23:22:41 · 905 阅读 · 0 评论 -
找出字符串中的最长回文子串
https://leetcode-cn.com/problems/longest-palindromic-substring/解法1:动态规划第一次提交时,超时! 修补后可以通过:https://leetcode-cn.com/problems/longest-palindromic-substring/solution/zui-chang-hui-wen-zi-chuan-by-leetcode-solution/class Solution {public: st...原创 2020-09-19 13:06:28 · 502 阅读 · 0 评论 -
二叉树的遍历- 递归法 与 循环法
递归方法-前序遍历(先访问根节点,然后左侧,然后右侧)void preOrderTraverse(Node* root) { if (root) { cout << root->val<<" "; preOrderTraverse(root->left); preOrderTraverse(root->right); }}循环方法-前序遍历(先访问根节点,然后左侧,...原创 2020-09-19 11:43:51 · 215 阅读 · 0 评论 -
实现两个正整数相加,不适用加减号
思路1:按照二进制相加,从最低位开始相加,如果两者都是1,则进位。判断两个bit时,使用与或这种操作即可。原创 2020-08-27 22:45:17 · 221 阅读 · 0 评论 -
最长上升子序列
Ref:https://www.cnblogs.com/812-xiao-wen/p/10992613.html原创 2020-08-16 13:07:29 · 91 阅读 · 0 评论 -
砝码称重 51Nod - 1449
https://www.51nod.com/Challenge/Problem.html#problemId=1449题解:如果让一些砝码表示m的话,只需要将m转化为w进制数。如果转换结果的每一位不是0就是1,则没有问题,即货物的重量可以由砝码正好拼起来;如果,转换的结果中有bit位不是0且不是1,需要特殊考虑了:a)如果是w-1,则ok,以利用天平使m加上 一个由0、1组成的w进制数等于另一个由0、1组成的w进制数. b)如果是其他的,则not ok;例如,w=7时,m转换为7进...原创 2020-07-26 12:00:47 · 166 阅读 · 0 评论 -
求两个整数的最大公约数
法1: 辗转相除法用大数对小数求余,若余数为0,则除数为最大公约数。若余数不为0,将此余数作为除数,小数作为被除数,重新求余,直到余数为0为止。此时的最大公约数为除数。例如:27和6. 27%6=3. 6%3=0. 所以最大公约数为3.(代码如下)int main() { int min = 4; int max = 26; while(min>0)//当余数为零时,此时的除数为两者的最大公约数 { int yu =max/min; ...原创 2020-07-26 11:20:10 · 1316 阅读 · 0 评论 -
给定一个天平和n种砝码,每种砝码的数量无限,判断是否能测量任意重量的砝码
题目给定几种重量的砝码,数量不限,判断是否可以称出任意重量的物品。输入规则,第一行输入一个整数n,表示有n种砝码;然后挨个输入每个砝码的重量。可以称重的物品都是整数。能,就输出YES;不能,输出NO。示例1输入:11输出:YES第一个1是有一种重量的砝码,第二个1是这个砝码是多重。这样肯定可以称出任意重量的物品。示例2输入:22 3输出:YES第一个2是有两种重量的砝码,第二行2 3表示每种砝码重量是2和3,那么也是可以称出任意重量的物品。...原创 2020-07-26 11:07:02 · 1418 阅读 · 1 评论 -
汉诺塔问题
汉诺塔问题来源于印度。有三个金刚石塔,第一个从小到大摞着64片黄金圆盘,底层的圆盘大于上层。现在把圆盘按大小顺序重新摆放在最后一个塔上。并且规定,在小圆盘上不能放大圆盘,在三个塔之间一次只能移动一个圆盘。from石塔上总共有n个圆盘,请问最少需要移动多少次才能将所有的圆盘放到to石塔?(可以将从from拿下来的圆盘再放回去,只要小的在大的上面即可)。嗯,递归的方法,分析了大约15min搞定了:设圆盘的个数为n,需要移动的次数为f(n)1) n=1, f(1) = 1;2)...原创 2020-07-26 10:10:45 · 696 阅读 · 0 评论 -
瓶子破碎的最高安全楼层
我辈喜学剑,十年居寒潭。一朝斩长蛟,碧水赤三月Description:有n层的楼,有两个强度相同的瓶子,设计一个办法来检测该种瓶子的可以承受的最高楼层。如果,瓶子从第x楼扔下后不会碎,从第x+1层扔下来之后碎了,则其最高承受楼层为x。瓶子不碎的话可以捡起来继续扔。方法1:interview时临时想起的,脑子中冒出来了快慢指针的思想,于是想出来该种方法,思路是对的,但是不是最好的。 见多识广的重要性阿...原创 2020-06-06 11:17:24 · 624 阅读 · 0 评论 -
尾递归
当递归调用是整个函数体中最后执行的语句且它的返回值不属于表达式的一部分时,这个递归调用就是尾递归。尾递归函数的特点是在回归过程中不用做任何操作,这个特性很重要,大多数现代的编译器会利用这种特点自动生成优化的代码。尾递归的原理:当编译器检测到一个函数调用是尾递归的时候,它就覆盖当前的活动记录而不是在栈中去创建一个新的。编译器可以做到这点,因为递归调用是当前活跃期内最后一条待执行的语句,于是当这个调用返回时栈帧中并没有其他事情可做,因此也就没有保存栈帧的必要了。通过覆盖当前的栈帧而不是在...原创 2020-05-29 08:23:53 · 184 阅读 · 0 评论 -
给定数字N,生成1,2,3...,N共N个不重复的随机数
题目:给定数字N,N>0, 设计一个随机数生成器,运行该生成器N次,能够不重复地生成1,2,..,N。思路1:最简单的方法,首先定义一个随机数生成器,其可以生成1-N范围内的随机数。 第一次运行时生成一个随机数,然后记录该随机数已经生成过,例如,可以定义数组bool array[N]={false}, 第一次生成了x,则置array[x-1]=true; 第二次时,先生成一个随机数,然后检查是否已经了,如果是,则重新生成,直到生成一个没有生成过的为止。缺点: 可能会花费很长...原创 2020-05-29 08:08:25 · 1022 阅读 · 0 评论