![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
算法之路《剑指offer》
文章平均质量分 78
学无止境丶
https://github.com/fwdhz998。深度学习的副产品就是广度学习。
展开
-
线段树:修改O(logn),查询O(logn),但是要预处理O(nlogn)
题目描述老师想知道从某某同学当中,分数最高的是多少,现在请你编程模拟老师的询问。当然,老师有时候需要更新某位同学的成绩. 输入描述:输入包括多组测试数据。每组输入第一行是两个正整数N和M(0 < N <= 30000,0 < M < 5000),分别代表学生的数目和操作的数目。学生ID编号从1编到N。第二行包含N个整数,代表这N个学生的初始成绩,其中第i个数代表ID为i的学生原创 2017-03-27 13:00:46 · 451 阅读 · 0 评论 -
机器人的运动范围:回溯法-->能用递归就不用栈。
题目描述地上有一个m行和n列的方格。一个机器人从坐标0,0的格子开始移动,每一次只能向左,右,上,下四个方向移动一格,但是不能进入行坐标和列坐标的数位之和大于k的格子。 例如,当k为18时,机器人能够进入方格(35,37),因为3+5+3+7 = 18。但是,它不能进入方格(35,38),因为3+5+3+8 = 19。请问该机器人能够达到多少个格子?class Solution {原创 2017-03-30 19:29:32 · 323 阅读 · 0 评论 -
“排序+计数”实现找顺子功能
题目描述LL今天心情特别好,因为他去买了一副扑克牌,发现里面居然有2个大王,2个小王(一副牌原本是54张^_^)...他随机从中抽出了5张牌,想测测自己的手气,看看能不能抽到顺子,如果抽到的话,他决定去买体育彩票,嘿嘿!!“红心A,黑桃3,小王,大王,方片5”,“Oh My God!”不是顺子.....LL不高兴了,他想了想,决定大\小 王可以看成任何数字,并且A看作1,J为11,Q为12原创 2017-03-23 17:29:40 · 604 阅读 · 0 评论 -
矩阵中的路径:回溯法,递归与栈。
题目描述请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。如果一条路径经过了矩阵中的某一个格子,则该路径不能再进入该格子。 例如[a b c e s f c s a d e e]是3*4矩阵,其包含字符串"bcced"的路径,但是矩阵中不包含“abcb”路径,因为字符串的第一个字原创 2017-03-30 10:39:51 · 1014 阅读 · 0 评论 -
C++:把一个数从M进制转为N进制。
#include #include using namespace std;string chageMtoN(string&str, int M, int N){ int hashch[256]; for (int i = 0; i <= 9; ++i) hashch['0' + i] = i; for (int i = 10; i <= 35; ++i) hashch['A' +原创 2017-03-22 22:59:22 · 5398 阅读 · 0 评论 -
Numeric Keypad:多思考,别蛮力!
题目描述The numberic keypad on your mobile phone looks like below:123456789 0 suppose you are holding your mobile phone with single hand. Your thumb points at digit 1. Each time you can 1)pr原创 2017-03-22 21:33:45 · 822 阅读 · 0 评论 -
合并两个排序的链表:专注代码的鲁棒性.
题目描述输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。/*struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next(NULL) { }};*/class Solution原创 2017-03-13 16:18:58 · 210 阅读 · 0 评论 -
滑动窗口的最大值-->双端队列,O(n)的时间。
题目描述给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值。例如,如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3,那么一共存在6个滑动窗口,他们的最大值分别为{4,4,6,6,6,5}; 针对数组{2,3,4,2,6,2,5,1}的滑动窗口有以下6个: {[2,3,4],2,6,2,5,1}, {2,[3,4,2],6,2,5,1}, {2,3,[4,2,6],原创 2017-03-29 17:30:39 · 753 阅读 · 0 评论 -
中位数:得到正确的浮点数,需加一个1.0* (size&1)==0,注意有括号。
题目描述如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值注意事项:1.两个整数n,m,(double) n/m的结果还是整除(n/m)的结果,即使前面加了(double),因为它会先算n/m再用double对得到的整数强制转换。所以原创 2017-03-28 21:49:56 · 1181 阅读 · 1 评论 -
二叉搜索树的第K个节点:递归中用参数返回值。
题目描述给定一颗二叉搜索树,请找出其中的第k大的结点。例如, 5 / \ 3 7 /\ /\ 2 4 6 8 中,按结点数值大小顺序第三个结点的值为4。思路:1.二叉搜索树的中序遍历结果就是从小到大排序的结果。所以中序遍历的第K个节点即为所求。2.递归中要得到值,不一定要返回值,可以返回值为void,然后在参数中,通过“地址“或引用的形式修改参数的值,即得到原创 2017-03-28 21:22:59 · 398 阅读 · 0 评论 -
序列化二叉树:先序遍历
题目描述请实现两个函数,分别用来序列化和反序列化二叉树 1. 对于序列化:使用前序遍历,递归的将二叉树的值转化为字符,并且在每次二叉树的结点不为空时,在转化val所得的字符之后添加一个' , '作为分割。对于空节点则以 '#' 代替。意思是,如果【1,NULL,NULL】,那么序列化结果为"1,##",左右字数中间没有','吗? 2. 对于反序列化:按照前序顺序,递归的使用原创 2017-03-28 20:18:56 · 662 阅读 · 0 评论 -
翻转单词顺序VS左旋转字符串----->“字符串翻转”
题目描述牛客最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句子在本子上。同事Cat对Fish写的内容颇感兴趣,有一天他向Fish借来翻看,但却读不懂它的意思。例如,“student. a am I”。后来才意识到,这家伙原来把句子单词的顺序翻转了,正确的句子应该是“I am a student.”。Cat对一一的翻转这些单词顺序可不在行,你能帮助他么?思路:翻转字符串原创 2017-03-21 15:27:08 · 286 阅读 · 0 评论 -
二叉树层次遍历:Queue+每一层一个NULL标记
题目描述请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。思路:一个Queue+每一层一个NULL标记 即可。每当队列头部检测到NULL时,代表上一层的遍历已经结束,此时队列中存放的是下一层的节点,所以要在队列尾部中再添加一个NULL。/*struct TreeN原创 2017-03-28 17:10:17 · 1865 阅读 · 0 评论 -
顺时针打印矩阵-----防止混乱,可一圈一圈的打印。
题目描述输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10.注意如果,那一圈,只有一列,则要提前终止,不然会重复打印那一圈。class Solution {publi原创 2017-03-14 16:16:14 · 246 阅读 · 0 评论 -
双端链表<--->环形链表,stl库中 list<int>的使用
题目描述每年六一儿童节,牛客都会准备一些小礼物去看望孤儿院的小朋友,今年亦是如此。HF作为牛客的资深元老,自然也准备了一些小游戏。其中,有个游戏是这样的:首先,让小朋友们围成一个大圈。然后,他随机指定一个数m,让编号为0的小朋友开始报数。每次喊到m-1的那个小朋友要出列唱首歌,然后可以在礼品箱中任意的挑选礼物,并且不再回到圈中,从他的下一个小朋友开始,继续0...m-1报数....这样下去原创 2017-03-23 19:52:08 · 925 阅读 · 0 评论 -
1+2+3....+n的构造函数求法(类的静态成员变量)
解法一:1.static变量在类外赋值,且前面要加类型。3 类的静态成员变量在使用前必须先初始化。2.这题为什么要先reset一下,在外面不是赋值了吗?class tmpClass{public: tmpClass() { ++N; sum+=N; } static int getsum() {原创 2017-03-23 21:07:14 · 502 阅读 · 0 评论 -
构建乘积数组。
题目描述给定一个数组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[k] = leftproduct[k] * rightproduct[k];所以只要两次遍历即可,O(2原创 2017-03-26 21:39:50 · 292 阅读 · 0 评论 -
连续子数组的最大和:DP或者贪心
题目描述HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学。今天测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决。但是,如果向量中包含负数,是否应该包含某个负数,并期望旁边的正数会弥补它呢?例如:{6,-3,-2,7,-15,1,2,2},连续子向量的最大和为8(从第0个开始,到第3个为止)。你会不会被他忽悠住?(子向量原创 2017-03-16 17:29:09 · 3285 阅读 · 2 评论 -
最小的K个数:二种思路:快排的精髓-----最大堆
输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。解法1:利用快排的第一步partion函数,一次遍历即分隔两部分。这方法麻烦!!class Solution {public: vector GetLeastNumbers_Solution(vector input, int k) {原创 2017-03-16 15:55:58 · 381 阅读 · 0 评论 -
数组中出现次数超过一半的数字:虽然hash是o(1)的时间,但是空间却有O(n)
题目描述数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。class Solution {public: int MoreThanHalfNum_Solution(vector numbers) {原创 2017-03-16 15:20:54 · 402 阅读 · 0 评论 -
字符串的全排列:看似繁杂,递归则简。
题目描述输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。 输入描述:输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母。思路:1.固定第一个字符,后面的字符全排列。。。2.固定前两个字符,后面的字符全排列。。。一直递归下去。原创 2017-03-15 23:13:26 · 198 阅读 · 0 评论 -
复杂链表的复制:满大街的O(1)解法,我觉得O(n)简单多了。
题目描述输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)总结:标准答案不是我这样的,但是我这样的很简介不是吗?爽了就行啦/*struct RandomListNode { int labe原创 2017-03-15 17:18:46 · 377 阅读 · 0 评论 -
二叉树和为某一值的路径:DFS也可以在递归中“入栈,弹栈”,用引用即可。
题目描述输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。总结:DFS除了可以“打印”,还可以储存值,传递引用的同时,它就可以。/*struct TreeNode { int val; struct TreeNode *left; struct T原创 2017-03-15 16:25:22 · 323 阅读 · 0 评论 -
二叉搜索树的后序遍历序列:递归中不要过早return f(左)&&f(右)
题目描述输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。总结:递归中不要过早return f(左)&&f(右) ,一般情况没有这么完备,还要分段考虑,这题左子树可能为空,右子树也可能为空,所以不要一想到二叉树递归就是 return f(左)&&f(右)class原创 2017-03-15 15:42:08 · 356 阅读 · 0 评论 -
勿忘《暴力解》:总是想着O(n),经常忽略暴力解。substr函数是个好函数
题目描述A string s is LUCKY if and only if the number of different characters in s is a fibonacci number. Given a string consisting of only lower case letters , output all its lucky non-empty substrin原创 2017-03-15 12:42:47 · 238 阅读 · 0 评论 -
C++ atoi的自定义实现:异常的输入考虑
题目描述将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数。 数值为0或者字符串不是一个合法的数值则返回0 输入描述:输入一个字符串,包括数字字母符号,可以为空输出描述:如果是合法的数值表达则返回该数字,否则返回0输入例子:+2147483647 1a33输出例子:2147483647 0考点:异常输入是否考虑原创 2017-03-24 10:20:52 · 1464 阅读 · 0 评论 -
栈的压人、弹出序列。经常在while循环中漏掉++ --
题目描述输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)注意:经常在while循环中漏掉++ -- 太过注重细节,而忽略的原创 2017-03-14 17:27:57 · 330 阅读 · 0 评论 -
不用加减乘除做加法:1.异或 2.sizeof
题目描述写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。1.利用sizeof(),但是注意,对于非数组类型,sizeof()返回的是函数指针的值。2.利用异或运算,但是注意,进位要考虑,还有,负数的情况,相减的情况都要考率。class Solution {public: int Add(int num1, int原创 2017-03-23 21:56:05 · 1148 阅读 · 0 评论 -
对称的二叉树:带有两个root的递归函数。
题目描述请实现一个函数,用来判断一颗二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。思路:这题我没有做出来,真是蠢,没得话说,直接递归即可。/*struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; Tr原创 2017-03-28 16:19:47 · 337 阅读 · 0 评论 -
二叉树的下一个节点:无需线索化,直接找规律。
题目描述给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。思路:抓住中序遍历的本质,左根右,找规律即可。分析二叉树的下一个节点,一共有以下情况:1.二叉树为空,则返回空;2.节点右孩子存在,则设置一个指针从该节点的右孩子出发,一直沿着指向左子结点的指针找到原创 2017-03-28 15:10:01 · 407 阅读 · 0 评论 -
删除链表中重复的节点:重新使用一个新头节点。
题目描述在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5思路:不要怕麻烦!勇敢的为自己设置标志flag,麻烦越多,就多设几个flag.重新使用一个新头节点。/*struct ListNode { int val;原创 2017-03-28 10:28:57 · 465 阅读 · 0 评论 -
旋转数组求某个值:今日头条面试题--二分法
Suppose an array sorted in ascending order is rotated at some pivot unknown to you beforehand.(i.e., 0 1 2 4 5 6 7 might become 4 5 6 7 0 1 2).You are given a target value to search. If foun原创 2017-03-19 20:10:32 · 333 阅读 · 0 评论 -
算法:字符串编码 (将连续的字符替换成“连续出现的个数+字符”)
给定一个字符串,请你将字符串重新编码,将连续的字符替换成“连续出现的个数+字符”。比如字符串AAAABCCDAA会被编码成4A1B2C1D2A。 输入描述:每个测试输入包含1个测试用例每个测试用例输入只有一行字符串,字符串只包括大写英文字母,长度不超过10000。输出描述:输出编码后的字符串输入例子:AAAABCCDAA输出例子:4原创 2017-03-05 22:21:10 · 3835 阅读 · 0 评论 -
网易编程:寻找所有横,竖,左上到右下,右上到左下,四种方向的所有和
[编程题] 最大和在一个N*N的数组中寻找所有横,竖,左上到右下,右上到左下,四种方向的直线连续D个数字的和里面最大的值 输入描述:每个测试输入包含1个测试用例,第一行包括两个整数 N 和 D :3 <= N <= 1001 <= D <= N接下来有N行,每行N个数字d:0 输出描述:输出一个整数,表示找到的和的最大值输入例子:4 287原创 2017-03-06 12:59:51 · 1862 阅读 · 0 评论 -
阿里笔试:去重和排序,重新输出Markdown格式
#include #include #include #include #include using namespace std;int main(){ string str; map j_1_mp, j_2_mp, content; while (cin >> str) { if (str[0] == '#'&&str[1] != '#') {原创 2017-03-09 11:10:04 · 407 阅读 · 0 评论 -
旋转数组的最小值:求中间值我竟然求错。
题目描述把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。注意:求中间值是(mid=(right+left)/2;)而不是mid=(right-l原创 2017-03-19 00:31:59 · 265 阅读 · 0 评论 -
重建二叉树:递归
题目描述输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。注意:递归终止条件,假设所有的输入均是有效且完美的,那么最后的叶节点一定是对应的一个数字。/** * Definition原创 2017-03-18 22:43:20 · 503 阅读 · 0 评论 -
字符串后移: 从后往前移!!!
题目描述请实现一个函数,将一个字符串中的空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happyclass Solution {public: void replaceSpace(char *str, int length) { if (str == NULL || length <= 0) return原创 2017-03-18 21:27:53 · 5024 阅读 · 0 评论 -
数组中的逆序对:归并排序的变形。
题目描述在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出。 即输出P%1000000007 输入描述:题目保证输入的数组中没有的相同的数字数据范围: 对于%50的数据,size 对于%75的数据,size 对于%100的数据,size输入例子:原创 2017-03-18 17:09:04 · 269 阅读 · 0 评论 -
腾讯笔试:[编程题] 有趣的数字<最简洁版> map的运用,rbegin()是最后一个值的迭代器。
#include #include #include #include #include using namespace std; int main() { int n; while(cin>>n) { vector vec(n,0); for (int i =原创 2017-03-08 19:00:27 · 236 阅读 · 0 评论