自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(23)
  • 问答 (10)
  • 收藏
  • 关注

原创 剑指offer—对称二叉树(二叉树的复制,翻转,比较)

题目要求:请实现一个函数,用来判断一颗二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。判断一颗二叉树是不是对称二叉树,两种思路:1.将二叉树复制,翻转,再将两棵树比较,看是否相同;2.左右子树相比,左子树的左子树和右子树的右子树相比,左子树的右子树和右子树的左子树相比,然后递归。1.1将二叉树复制,翻转,再进行比较二叉树的复制不能仅仅只将根节点备份,比如TreeNode *Root=pRoot,这样是没有意义的,对pRoot的改变同样会改变Root,所以需要新建一

2020-05-31 13:21:41 196

原创 剑指offer—二叉树的下一个节点

题目描述:给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。按照中序遍历,可能出现以下几种情况:1.当前节点有右子节点。则下一个节点为右子树的最左侧节点;2.当前节点没有右子节点,也就是说在该子树已经遍历完毕,需要返回到上一层节点。中序遍历是从左向右遍历每个子树,如果该子树是左子树,那还有右子树可以遍历,所以其父节点是某一个节点的左节点。下一个节点就是父节点的父节点。如果该子树是右子树,那就意味着遍历结束,也即它所有的

2020-05-30 20:54:24 112

原创 剑指offer—左旋字符串

题目:对于一个给定的字符序列S,请你把其循环左移K位后的序列输出。例如,字符序列S=”abcXYZdef”,要求输出循环左移3位后的结果,即“XYZdefabc”。字符串的循环左移可以看做是字符串的拼接,即把前一部分字符串挪到后一部分字符串后面。这里使用了string里的substr函数。substr函数原型如下:string substr (size_t pos = 0, size_t len = npos) const;pos:pos是复制字符的起始位置,如果pos等于要复制str字符串的长度,则

2020-05-25 17:26:45 78

原创 剑指offer—和为S的连续正数序列

题目:输出所有和为S的连续正数序列。序列内按照从小至大的顺序,序列间按照开始数字从小到大的顺序本题显然要进行穷举,因为是正整数,所以穷举范围从1开始,因为至少要两个数,所以到sum-1为止。 用一个辅助函数对每一个要穷举的数字进行检测,看是否存在序列和等于sum。若存在,则将该组数放进数组。bool sequence(int n,int m,vector<int> &res){ int sum=0; int i; for(i=n;i<m;++i) { sum

2020-05-25 16:34:34 91

原创 C++输入多行数据

在进行笔试的时候,很多道题都有如下形式:输入n,表示接下来要输入n行数据接下来输入n数据,例如:31 2 33 4 512 3 65 7这里采用getline来处理多行的输入int _tmain(int argc, _TCHAR* argv[]){ int n; cin>>n; cin.ignore (); string s; vector<string> res(n); for(int i=0;i<n;++i) { getline(cin

2020-05-24 17:43:21 6498 1

原创 C++ 分割字符串

在C++的笔试中,大家经常遇到需要对输入的字符串进行分割。在python中可以方便的使用split进行分割,C语言中可以使用strtok函数,strtok函数原型是char *strtok(char *s, char *delim),在而在C++中要对string字符串进行分割,就需要我们自己写函数实现了。void split(vector<string> &res,string input,char mark){ string temp; for(int i=0;i<in

2020-05-24 16:32:44 176

原创 剑指offer—最小的k个数

题目:输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。本题用sort对输入数组进行排序,然后从前往后数k个数即可注:遇到的问题:在输入不合法的情况下,要返回 vector res,不能返回vector res(k),此外,要注意输入合法。vector<int> GetLeastNumbers_Solution(vector<int> input, int k) { vector<in

2020-05-23 16:38:37 92

原创 剑指offer—构建乘积数组

题目:给定一个数组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[0] = A[1] * A[2] * … * A[n-1],B[n-1] = A[0] * A[1] * … * A[n-2];)本题我们需要先写一个辅助函数,用来处理B中每个元素是A中除i以外所有元素的乘积。除i是用erase函数实现。int multi(vector<int> A,int n

2020-05-23 16:19:07 83

原创 剑指offer—数组中重复的数字

题目:在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是第一个重复的数字2。本题采用哈希大发来解决,通过哈希表来统计每个数字出现的次数,然后遍历哈希表找到值大于1的主键。注:1.要注意题目中所说的所有数字在0到n-1之间,输入要有效,要根据这个条件判别输入数据是否合法。2.遍历哈希表的办法:a.用数组中的每

2020-05-23 15:57:18 103

原创 剑指offer—数组中出现次数超过一半的数字

题目:数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0需要知道每个数字出现的次数,显然先用哈希表。然后找出出现次数最多的那个数字,然后看一下是否超过数组长度一半即可。int MoreThanHalfNum_Solution(vector<int> numbers) { int len=numbers.size(); if(len

2020-05-22 16:44:08 110

原创 剑指offer58—把二叉树打印成多行

题目:从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。显然这是二叉树的层次遍历,在遍历的过程中将节点值按层存储。问题的关键在于怎么按层存储。我们知道二叉树的层次遍历是每一层的子节点入栈,然后该层节点出栈,所以while的每一层循环开始时,队列里的元素都是二叉树同一层的所有节点,我们记下此时的元素数量n,然后再使用一个while把队列里的前 n个元素的值放入临时数组row,也就是每一行的值。注:因为读取值的时候需要不断队首出队,如果读取值和把子节点入队的过程分开,就会导致有的节点出队了但

2020-05-22 16:07:13 86

原创 剑指offer—小孩转圈删除游戏

题目:,让小朋友们围成一个大圈。然后,他随机指定一个数m,让编号为0的小朋友开始报数。每次喊到m-1的那个小朋友要出列唱首歌,然后可以在礼品箱中任意的挑选礼物,并且不再回到圈中,从他的下一个小朋友开始,继续0…m-1报数…这样下去…直到剩下最后一个小朋友(注:小朋友的编号是从0到n-1)我们使用vector数组的erase函数来解决这个问题,遇到要出圈的孩子用erase删除,遇到数组结尾重新指向数组头就是了。int LastRemaining_Solution(int n, int m) {

2020-05-21 16:01:51 125

原创 剑指offer—和为S的两个数字

题目:输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。题目所给出的数组是递增数组,所以我们采用双指针,一个指向数组头部,一个指向尾部。如果头尾数组值相加小于sum,那么头指针向右移动;如果大于sum,那么尾指针向左移动;如果相等,停止循环,此时的结果即为所求结果(因为相差越远,乘积越小,所以第一次相加等于sum的首尾值即为所求值);如果直到头尾指针相遇,即left=right依旧没有相等的情况出现,那么返回0。注:当然,如果

2020-05-20 16:39:41 86

原创 剑指offer—数组再排序数组中出现的次数

题目:统计一个数字在排序数组中出现的次数。大家的第一想法应该就是使用map来进行统计每个数字出现的次数,然后找到这个数对于的值即可。int GetNumberOfK(vector<int> data ,int k) { if(data.empty() ) return 0; else { map<int ,int> temp; for(auto i:data) temp[i]++; int res=temp[k]; return res

2020-05-19 17:28:39 65

原创 剑指offer—二叉树的层次遍历

题目:从上往下打印出二叉树的每个节点,同层节点从左至右打印。显然本题是要用二叉树的层次遍历.1.将根节点放入队列2.记录队首元素值3.判断队首元素的左右子节点是否为空,不为空入队4.记录队首元素的值,队首元素出队vector<int> PrintFromTopToBottom(TreeNode* root) { queue <TreeNode *> temp; vector<int> res; int cnt=0; if(root

2020-05-19 16:39:36 73

原创 剑指offer—短路求值原理

题目:求1+2+3+…+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。这道题的难点在于如何判断连加停止。不能用循环那我们可以用递归来实现连加,停止条件就是当n=0的时候不进行递归。这里就需要用到&&运算符。&&运算符有一个短路特性,即第一个条件成立才判断第二个条件,如果第一个条件不成立,那么就不会执行第二个条件。这里我们就用到了&&短路进行求值。 int Sum_Solution(

2020-05-18 16:23:09 186

原创 leetcode22题题解——括号生成

题目:数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。有效的括号组合就是指:1.插入数量不超过n2.可以插入 ) 的前提是 ( 的数量大于 )我们可以把整个过程理解为一个二叉树,左子树为增加左括号,右子树为增加右括号 。当左括号数量小于右括号时,那就这能增加左括号了,也就是只有左子树。如果左括号已经没有了,那就只能增加右括号,也就是只有右子树。左右括号都没有了,那就是没有子树了。最后看一下有多少叶子结点就是多少种方案。本文通过深度优先搜索来遍历二叉树寻找

2020-05-15 16:35:53 147

原创 剑指offer—找出字符串中第一个只出现一次的字符

我们可以建立一个哈希表,通过检索值为1的主键来确定第一个只出现一次的字符是哪个,然后在哈希表里找到它就好了,时间复杂度为O(n)。int FirstNotRepeatingChar(string str) { unordered_map<char,int> st; int l=str.length (); for(int i=0;i<l;++i) st[str[i]]++; for(int i=0;i<l;++i) if(st[str[i]]

2020-05-11 17:36:46 95

原创 剑指offer—两个链表第一个公共节点

要求两个链表第一个公共节点,一种直观的思想就是用一个链表的每一个节点与另一个链表的所有节点进行比较,看有没有相同的。这种方法时间复杂度为O(m*n)。我们不妨换种思路,如果两个链表有相交的节点,那么之后所有的节点都相同。所以,先让长链表走完多的步长,然后看此时节点是否相同即可。ListNode* FindFirstCommonNode( ListNode* pHead1, ListNode* pHead2) { int len1=len(pHead1 ); int len2=len(pHead2

2020-05-11 16:44:32 82

原创 剑指offer—数组中只出现一次的数字

题目要求在一个数组中找出只出现一次的数字。这个题很简单,把所有数字放进map里,然后看一下哪些key的value等于1,找出它们输出就是了。void FindNumsAppearOnce(vector<int> data,int* num1,int *num2) { vector<int> res; map<int ,int> cnt; for(auto i:data) cnt[i]++; for(auto j:cn

2020-05-10 17:40:30 99

原创 剑指offer—位运算实现加法

题目要求不用加减乘除实现加法。对于计算机而言,除了加减乘除就只剩位运算了。所以,该题要求使用位运算来实现加法。对于一个正常的加法运算:124+891.相加各位的值,不管进位,得到1032.计算进位值,110。如果进位值为0,那么相加值就是结果3.重复上述两步,计算103和110相加结果,不管进位得到213,进位值为0,所以相加值即为结果213。那么,怎么通过位运算来实现这个过程呢?1.相加各位的值,不管进位:异或。相同为0,不同为12.计算进位的值:与和左进位,两个都是1,才是1,然后向左进1

2020-05-10 17:14:49 118

原创 剑指offer—包含min函数的栈

min函数的作用是实时找出栈中的最小值,但同时题目要求的时间复杂度为O(1),所以min函数不能对栈中数据进行遍历。本文是通过额外设置一个min栈存储最小值来解决这个问题。1.在数据放入栈中时,将最小值放入min栈中;2.数据出栈时,如果是最小值出栈,则将min栈里的值也出栈。class Solution {public: stack<int> temp,mins; ...

2020-05-03 14:40:36 72

原创 招行FT训练营笔试第二题题解

招行笔试第二题是leetcode第765题:情侣牵手。这题要求最少移动个数,我们通过贪心算法来解决。贪心算法即为先通过交换让第一对情侣在一起,然后在看第二对,依次遍历所有数据。对本题来讲,每组数是较小的偶数和大1的奇数,两者位置可互换。所以解题时,我们先判别每组的第一个数是偶数还是奇数。如果是偶数,往后找到比它大1 的奇数,然后与该组第二个数交换。如果是奇数,往后找到比它小1 的偶数,然后与...

2020-05-02 16:37:41 674

空空如也

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

TA关注的人

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