- 博客(157)
- 资源 (12)
- 收藏
- 关注
原创 新建servlet的时候自动生成web.xml配置
如果还未建项目,那么选择Dynamic Web project的module verision选择2.5,如果选了3,那么就不会自动生成。如果已建项目,考虑重建项目,再选择2.5
2020-05-24 17:53:18
747
原创 一刷剑指offer(50)——树中两个结点的最低公共祖先
//GetLastCommonNode用来得到两个路径path1和path2的最后一个公共结点TreeNode* GetLastCommonNode(const list<TreeNode*>& path1,const list<TreeNode*>& path2){ list<TreeNode*>::const_iterator ...
2019-10-20 08:30:00
183
原创 一刷剑指offer(49)——把字符串转换成整数
enum Status {kValid=0,kInValid};int g_nStatus=kValid;long long StrToIntCore(const char* digit,bool minus){ long long num=0; while(*digit!='\0') { if(*digit>='0' && ...
2019-10-19 08:29:41
246
原创 一刷剑指offer(48)——不能被继承的类
题目:用C++设计一个不能被继承的类。解法一:从构造函数下手C++中字类的构造函数会自动调用父类的构造函数,子类的析构函数会自动调用父类的析构函数。要想一个类不被继承,只需把它的析构函数和构造函数定义为私有函数即可,这样当一个类试图继承时,必然会因为调用构造函数和析构函数而导致编译出错。如何得到这样的一个实例?定义公有的静态函数来创建和释放类的实例。class Sea...
2019-10-18 07:34:23
164
原创 一刷剑指offer(47)——不用加减乘除做加法
题目:写一个函数,求两个整数之和,要求在函数体内不得使用加减乘除四则运算符号。求两数之和四则运算不可用,也就是说,只能用位运算。分析一下十进制加法的步骤:1、各位相加不进位2、做进位3、将前面两个结果加起来转换成位运算:1、不考虑进位,0+0=0,1+1=0,0+1=1,1+0=1,显然为异或运算。2、只有1+1才会产生进位,可以想象成两个数先做位与运算,然后再...
2019-10-17 07:42:53
120
原创 一刷剑指offer(46)——求1+2+..+n
题目:求1+2+..+n,要求不能使用乘除法,for,while,if,else,switch,case等关键字以及条件判断语句(A?B:C)。通常的求法:循环与递归,但是这里已经限制了使用循环(for,while)和递归(if)。可以考虑使用别的方法来间接实现循环与递归。解法一:构造函数——实现循环循环就是让相同的代码执行n遍,这里可以先定义一个类型,接着创建n个该类型的实例...
2019-10-16 07:31:17
124
原创 一刷剑指offer(45)——圆圈中最后剩下的数字
题目:0,1,....,n-1这n个数字排成一个圆圈,从数字0开始每次从这个圆圈里删除第m个数字。求出这个圆圈里剩下的最后一个数字。例如:0-1-2-3-4-0这5个数字组成一个圆圈,假如每次删除第3个数字,即删除2,0,4,1,最后剩下3。解法一:环形链表模拟创建一共有n个结点,然后每次在这个链表中删除第m个结点。可用STL中std::list模拟环形链表,但由于std::...
2019-10-15 08:16:04
87
原创 一刷剑指offer(44)——扑克牌的顺子
题目:从扑克牌中随机抽5张牌,判断是不是一个顺子,即这5张牌是不是连续的。2~10为数字本身,A为1,J为11,Q为12,k为13,大小王可看作任意数字。抽象:将5张牌看成由5个数字组成的数组。大小王不妨定义为0。如何判断5个数字是否连续?对数组进行排序。且当数组中出现不连续的空缺时,检查数组中0的个数,可用0去补空缺。步骤:1、数组排序2、统计0的个数3、统计排序...
2019-10-14 07:25:05
171
原创 一刷剑指offer(43)——n个骰子的点数
题目:把n个骰子扔在地上,所有骰子朝上的一面的点数之和为s。输入n,打印出s的所有可能的值出现的概率。骰子一共6个面,每个面上对应一个点数(1-6)。所以n个骰子点数和min=n,max=6n。n个骰子所有点数的排列数为6^n。要计算概率,即要先统计出每一个点数出现的次数,再除以6^n即可。解法一:递归1、将n个骰子分成两堆:1个 (n-1)个,单独骰子的点数+(n-...
2019-10-13 09:07:22
106
原创 一刷剑指offer(42)——翻转单词顺序VS左旋转字符串
题目:输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。为简单起见,标点符号和普通字母一样处理。例如输入"I am a student.",则输出"student. a am I"。思路:分两步进行翻转:1、翻转句子中所有的字符,此时不但翻转了句子中单词的顺序,单词内字符顺序也被翻转了。2、翻转单词中字符的顺序//翻转整个句子void Reverse(ch...
2019-10-12 07:21:01
100
原创 一刷剑指offer(41)——和为s的两个数字VS和为s的连续正数序列
题目:输入一个递增排序的数组和一个数字s,在数组中查找两个数,使得他们的和正好是s。如果有多对数字的和为s,输出任意一对即可。最直接的做法:双重循环依次尝试,时间复杂度O(n^2)。更好的方法:1、在数组中选择两个数字(不妨设两个指针,一个指向最小元素,一个指向最大元素),如果它们的和等于输入的s,就找到了两个数字;2、如果和小于s,由于已经排序,选择较小数字后面的数字,即第一...
2019-10-11 07:31:25
102
原创 一刷剑指offer(40)——数组中只出现一次的数字
题目:一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字,要求时间复杂度为O(n),空间复杂度为O(1)。例如输入{2,4,3,6,3,2,5,5},输出4和6。异或的性质:若A!=B,则A xor B=1;若A==B,则A xor B=0。即任意一个数字,异或它自己都为0。先不考虑数组中有两个只出现一次的数字,先考虑数组中仅有一个只出现...
2019-10-10 08:09:33
137
原创 一刷剑指offer(39)——二叉树的深度
题目:输入一颗二叉树的根结点,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。二叉树结点定义如下:struct BinaryTreeNode{ int m_nValue; BinaryTreeNode* m_pLeft; BinaryTreeNode* m_pRight;};递归:...
2019-10-09 07:20:10
176
原创 一刷剑指offer(38)——数字在排序数组中出现的次数
题目:统计一个数字在排序数组中出现的次数。例如输入排序数组{1,2,3,3,3,3,4,5}和数字3,由于3在这个数组中出现了4次,因此输出4.最直接的做法:先用二分查找算法找到一个3,由于3可能出现多次,因此我们找到的3的左右两边可能都有3,于是在找到的3左右两边顺序扫描,分别找到第一个3和最后一个3。因为要查找的数字在长度为n的数组中有可能出现O(n)次,因此这种算法的效率和直接从头到...
2019-10-08 08:02:34
147
原创 一刷剑指offer(37)——两个链表的第一个公共结点
题目:输入两个链表,找出它们的第一个公共结点。链表结点定义如下:struct ListNode{ int m_nKey; ListNode* m_pNext;};最直接的做法:在第一链表上顺序遍历每个结点,每遍历到一个结点时,在第二个链表上顺序遍历每个结点。如果在第二个链表上有一个结点和第一个链表上的结点一样,说明两个链表在这个结点上重合,于是找到它们的公...
2019-10-07 09:57:00
169
原创 一刷剑指offer(36)——数组中的逆序对
题目:在数组中的两个数字如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对总数。例如数组{7,5,6,4|中,存在5个逆序对:(7,6),(7,5),(7,4),(6,4),(5,4)。最直接的做法:顺序扫描整个数组,每扫描到一个数字,逐个比较该数字和它后面数字的大小。如果后面数字比它小,则这两个数字就组成了一个逆序对。假设数组中含有n个数字...
2019-10-06 09:13:57
73
原创 一刷剑指offer(35)——第一个只出现一次的字符
题目:在字符串中找到第一个只出现一次的字符。如输入“abaccdeff”,输出'b'。最直观的做法:从头开始扫描这个字符串中每个字符。当访问到某个字符时,拿这个字符和后面的每个字符相比较,如果在后面没有发现重复的字符,则该字符为只出现一次字符。若字符串有n个字符,那么时间复杂度为O(n^2)。哈希表法:由于题目与字符出现的次数相关,因此需要统计每个字符在字符串中出现的次数。可以...
2019-10-05 08:48:26
88
原创 一刷剑指offer(34)——丑数
题目:我们把只含因子2、3、5的数称作丑数。求按从小到大的顺序的第1500个丑数。例如6、8都是丑数,但14不是,因为它包含因子7。习惯上,我们把1当作第一个丑数。根据丑数的定义,丑数只能被2、3、5整数。判断一个数是否为丑数:如果能被2整除,那么把它连续除以2;如果能被3整除,那么把它连续除以3;如果能被5整除,那么把它连续除以5。最后结果为1,即为丑数。否则不是。bo...
2019-10-04 09:23:15
105
原创 一刷剑指offer(33)——把数组排成最小的数
题目:输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3、32、321},则打印321323。最直接的做法:先求出这个数组中所有数字的全排列,然后把每个排列拼起来,最后求出拼起来的数字的最大值。另一种做法:确定新的排序顺序。也就是给出两个数字m、n,需要确定一个规则判断m、n谁放前,谁放后,而不仅仅是比较两个数字的大小。如果...
2019-10-03 09:14:39
83
原创 一刷剑指offer(32)——从1到n整数中1出现的次数
题目:输入一个整数n,求从1到n这n个整数的十进制表示中1出现的次数。例如输入12,从1到12这些整数里,包含1的数字有1,10,11,12,1一共出现5次。最直接的思路:直接累加每个整数1出现的次数。对于小于10的数,对10求余判断整数个位数是否为1;对于大于10的数,除以10再判断个位数是否为1。int NumberOf1(unsigned int n){ int n...
2019-10-02 09:05:19
111
原创 一刷剑指offer(31)——连续子数组的最大和
题目:输入一个整型数组,数组里有正数也有负数。数组中一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。要求时间复杂度为O(n)。例如输入数组{1,-2,3,10,-4,7,2,-5},和最大子数组为{3,10,-4,7,2},子数组和为18。最直观的方法就是枚举数组的所有子数组并求出它们的和。一个长度为n的数组,总共有n(n+1)/2个子数组。计算出所有子数组的和,最快也要O(n...
2019-10-01 07:47:21
131
原创 一刷剑指offer(30)——最小的k个数
题目:输入n个整数,找出其中最小的k个数。例如输入4、5、1、6、2、7、3、8这8个数字,则最小的4个数字是1、2、3、4。最简单的思路:将输入的n个整数排序,排序之后位于最前面的k个数就是最小的k个数。时间复杂度O(nlogn)。另一种思路:基于快速排序Partition函数。基于数组的第k个数字来调整,使得比第k个数字小的所有数字都位于数组左边,比第k个数字大的所有数字都位于...
2019-09-30 08:48:51
87
原创 一刷剑指offer(29)——数组中出现次数超过一半的数字
题目:数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。直接的思路就是先给数组进行排序,然后就能很容易地统计出每个数字出现的次数。但是这种思路并没有考虑到数组的特性:数组中有一个数字出现的次数超过了数组长度的一半。如果将这个数组排序,那么排序之后位于数组中间的数字一定就是那个出现次数超过数组长度一半的数字,即中位数。bool g_bInputInvalid=false...
2019-09-29 08:37:28
89
原创 一刷剑指offer(28)——字符串的排列
题目:输入一个字符串,打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab,cba。求整个字符串的排列,可以看成两步:1、求所有可能出现在第一个位置的字符,即把第一个字符和后面所有的字符交换。2、固定第一个字符,求后面所有字符的排列,这时依然将后面的所有字符分成两部分:后面字符的第一个字符,以及...
2019-09-28 08:17:20
81
原创 一刷剑指offer(27)——二叉搜索树与双向链表
题目:输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新结点,只能调整树中结点指针的指向。二叉树结点定义如下:struct BinaryTreeNode{ int m_nValue; BinaryTreeNode* m_pLeft; BinaryTreeNode* m_pRight;};二叉搜索树与双向链表转换...
2019-09-27 07:32:07
81
原创 一刷剑指offer(26)——复杂链表的复制
题目:请实现函数ComplexListNode* Clone(ComplexListNode* pHead),复制一个复杂链表。在复杂链表中,每个结点除了有一个m_pNext指针指向下一个结点外,还有一个m_pSibling指向链表中的任意结点或者NULL。结点定义如下:struct ComplexListNode{ int m_nValue; ComplexList...
2019-09-26 08:23:00
84
原创 一刷剑指offer(25)——二叉树中和为某一值的路径
题目:输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。从树的根结点开始往下,一直到叶结点所经过的结点形成一条路径。二叉树结点定义为:struct BinaryTreeNode{ int m_nValue; BinaryTreeNode* m_pLeft; BinaryTreeNode* m_pRight;};由于路...
2019-09-25 08:32:08
91
原创 一刷剑指offer(24)——二叉搜索树的后序遍历序列
题目:输入一个整数数组,判断该数组是不是某二叉树的后序遍历结果。如果是,则返回true,否则返回false。假设输入的数组的任意两个数字互不相同。在后序遍历得到的序列中,最后一个数字是树的根结点。数组中前面的数字可以分为两部分:第一部分是左子树的结点,它们都比根结点小;第二部分是右子树的结点,它们都比根结点大。以数组{5,7,6,9,11,10,8}为例,后序遍历的结果的最后一个数字8...
2019-09-24 07:50:32
93
原创 一刷剑指offer(23)——从上往下打印二叉树
题目:从上往下打印出二叉树的每个结点,同一层的结点按照从左到右的顺序打印。二叉树结点定义如下:struct BinaryTreeNode{ int m_nValue; BinaryTreeNode* m_pLeft; BinaryTreeNode* m_pRight;};按层打印的顺序决定应该先打印根结点,所以从树的根结点开始分析。...
2019-09-23 07:59:44
83
1
原创 一刷剑指offer(22)——栈的压入,弹出序列
题目:输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1、2、3、4、5是某栈的压栈序列,序列4、5、3、2、1是该压栈序列对应的一个弹出序列,但4、3、5、1、2就不可能是该压栈序列的弹出序列。分析两个例子,找到规律:1、弹出序列4、5、3、2、1第一个希望被弹出的数字是4,因此4需要先压入辅助栈中,而在4...
2019-09-22 08:58:21
134
原创 一刷剑指offer(21)——包含min函数的栈
题目:定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的min函数。在该栈中,调用min、push和pop的时间复杂度都是O(1)。看到这个问题,第一反应就是每次压入一个新元素进栈时,将栈里的所有元素排序,让最小的元素位于栈顶,这样就可以在O(1)时间得到最小元素了,但是这种思路不能保证最后压入栈的元素能够最先出栈,因此这个数据结构已经不是栈了。思路:建立一个辅助栈,将每次的...
2019-09-21 08:01:29
78
原创 一刷剑指offer(20)——顺时针打印矩阵
题目:输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。由于是以从外圈到内圈的顺序依次打印,可以将矩形想象成若干个圈,循环打印矩阵,每一次打印矩阵中的一个圈。循环结束的条件:注意到左上角的坐标中行标和列标总是相同的。对于一个3*3矩阵,最后一圈只有一个数字,左上角对应坐标(1,1),3>1*2对于一个4*4矩阵,最后一圈有四个数字,左上角对应坐标(1,1)...
2019-09-20 13:36:21
120
原创 一刷剑指offer(19)——二叉树的镜像
题目:请完成一个函数,输入一个二叉树,该函数输出它的镜像。二叉树结点定义如下:struct BinaryTreeNode{ int m_nValue; BinaryTreeNode* m_pLeft; BinaryTreeNode* m_pRight;};镜像的特点:两棵树根结点相同,但它们的左右两个子结点交换了位置。求一颗树的镜...
2019-09-19 07:33:57
103
原创 一刷剑指offer(18)——树的子结构
题目:输入两颗二叉树A和B,判断B是不是A的子结构。二叉树结点的定义如下:struct BinaryTreeNode{ int m_nValue; BinaryTreeNode* m_pLeft; BinaryTreeNode* m_right;};要查找树A是否存在和树B结构一样的子树,可以分成两步:1、在树A中找到和B根结点的值一样...
2019-09-18 08:00:47
69
原创 一刷剑指offer(17)——合并两个排序的链表
题目:输入两个递增排序的链表,合并这两个链表并使新链表中的结点仍然是按照递增排序的。链表结点定义如下:struct ListNode{ int m_nValue; ListNode* m_pNext;};需要注意两个问题:1、清楚合并的过程,避免链表中间断开或者未实现递增排序;2、特别处理特殊输入。不断比较两个链表的头结点,将较小的头结点链接到已经合...
2019-09-17 08:10:25
66
原创 一刷剑指offer(16)——反转链表
题目:定义一个函数,输入一个链表的头结点,反转该链表并输出反转后链表的头结点。链表结点定义如下:struct ListNode{ int m_nKey; ListNode* m_pNext;};为了正确反转一个链表,需要调整链表中指针的方向。从原链表中挑出连续3个相邻的结点:h->i->j。如果将i的m_pNext指向h,则变成了h<-i ...
2019-09-17 07:41:17
62
原创 一刷剑指offer(15)——输出链表倒数第k个结点
鲁棒性:程序能够判断输入是否合乎规范要求,并对不合要求的输入予以合理的处理。通常会在函数的入口添加代码以验证用户输入是否符合要求,比如:如果输入是指针,需要考虑空指针的情况;如果输入是字符串,需要考虑空字符串的情况。题目:输入一个链表,输出该链表中倒数第k个结点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个结点。例如一个链表有6个结点,从头结点开始它们的值依次是...
2019-09-16 08:29:41
108
原创 一刷剑指offer(14)——调整数组顺序使奇数位于偶数前面
题目:输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分。如果不考虑时间复杂度,最简单的思路就是从头扫描这个数组,每遇到一个偶数时,就将位于这个数字后面的所有数字往前挪一位,同时将该偶数放入数组末尾最后一个空位。由于每遇到一个偶数就需要移动O(n)个数字,因此总的时间复杂度是O(n^2)。法一:题目要求把奇数放在数组的前...
2019-09-15 08:37:20
77
原创 一刷剑指offer(13)——在O(1)时间删除链表结点
题目:给定单向链表的头指针和一个结点指针,定义一个函数在O(1)时间删除该结点。链表结点与函数定义如下:struct ListNode{ int m_nValue; ListNode* m_pNext;};void DeleteNode(ListNode** pListHead,ListNode* pToBeDeleted);在单向链表中删除一个结点,最常规的做法...
2019-09-14 08:18:51
74
原创 一刷剑指offer(12)——打印1到最大的n位数
题目:输入数字n,按顺序打印出从1到最大的n位十进制数。比如输入3,则打印出1、2、3....999这个题目貌似很简单,最直接的方法就是先求出最大的n位数,然后用一个循环从1开始逐个打印。但是要注意的是,当输入的n很大的时候,会产生溢出,需要考虑大数问题。怎么表示大数?字符串或者数组。1、字符串模仿数字加法因为数字最大是n位,因此字符串长度应为n+1位(结束符号'\0'),当实...
2019-09-13 08:56:29
141
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人