剑指Offer(C++)
文章平均质量分 71
Gavynlee
旁人若问其中意 且到寒寨吃苦茶
展开
-
从上到下打印二叉树-之字形打印二叉树
面试题32:从上往下打印出二叉树的每个节点,同层节点从左至右打印。/*struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) { }};*/class Solution {publi...原创 2020-03-03 13:00:33 · 178 阅读 · 0 评论 -
【题目3】: 全排列(leetcode 46、47)
题目描述1给定一个不含重复数字的数组 nums ,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。示例 1:输入:nums = [1,2,3] 输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]示例 2:输入:nums = [0,1] 输出:[[0,1],[1,0]] 示例 3:输入:nums = [1] 输出:[[1]]提示:1 <= nums.length <= 6-10 <= nums[i] <原创 2021-10-04 11:05:25 · 940 阅读 · 0 评论 -
【面试题52】两个链表的第一个公共节点
题目描述面试题52:输入两个链表,找出它们的第一个公共结点。(注意因为传入数据是链表,所以错误测试数据的提示是用其他方式显示的,保证传入数据是正确的)思路分析找出2个链表的长度,然后让长的先走两个链表的长度差,然后再一起走(因为2个链表用公共的尾部)/*struct ListNode { int val; struct ListNode *next; ListNode(int x)...原创 2020-03-15 21:19:52 · 138 阅读 · 0 评论 -
【算法专题二】双指针
快慢指针面试题23.链表中环的入口节点原创 2021-10-03 14:51:33 · 425 阅读 · 0 评论 -
走方格-dp
题目描述思路分析(1)确定状态最后一步:子问题:(2)转移方程(3)初始条件和边界情况(4)计算顺序C++实现class Solution {public: // 使用动态规划解题,能够到达每个格子,只能是从他的上方或者左侧到达 int uniquePaths(int m, int n) { // 建立dp // vec...原创 2020-03-13 10:58:08 · 320 阅读 · 0 评论 -
递归与循环-跳台阶
普通跳台阶一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。/*对于本题,前提只有 一次 1阶或者2阶的跳法。a.如果两种跳法,1阶或者2阶,那么假定第一次跳的是一阶,那么剩下的是n-1个台阶,跳法是f(n-1);b.假定第一次跳的是2阶,那么剩下的是n-2个台阶,跳法是f(n-2)c.由a\b假设可以得出总跳法...原创 2020-02-14 17:27:37 · 483 阅读 · 0 评论 -
在排序数组中查找数字---二分法
面试题53:统计一个数字在排序数组中出现的次数。解法一:二分法的变形class Solution {public: int GetNumberOfK(vector<int> data ,int k) { if(data.empty()) return 0; int low = 0, high = data.size(...原创 2020-03-17 16:41:25 · 507 阅读 · 0 评论 -
包含min函数的栈
题目面试题30:定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1))。注意:保证测试中不会当栈为空的时候,对栈调用pop()或者min()或者top()方法。牛客网链接思路看到这个问题, 我们最开始可能会想, 添加一个成员变量用于保存最小元素, 每次压栈时如果压栈元素比当前最小元素更小, 就更新最小元素.但是这样会有一个问题, 如果最小元...原创 2020-03-02 22:07:30 · 186 阅读 · 0 评论 -
Leecode332:零钱兑换
题目描述给定不同面额的硬币 coins 和一个总金额 amount。编写一个函数来计算可以凑成总金额所需的最少的硬币个数。如果没有任何一种硬币组合能组成总金额,返回 -1。示例 1:输入: coins = [1, 2, 5], amount = 11输出: 3解释: 11 = 5 + 5 + 1示例 2:输入: coins = [2], amount = 3输出: -1说明:你...原创 2020-04-25 11:05:06 · 2562 阅读 · 2 评论 -
面试题34:二叉树中和为某一值的路径
题目面试题34: 输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径由结点和有向边组成,从根结点到叶节点。思路本题使用前序遍历的方式访问节点,使用二维向量result存储全部路径(有可能有多条路径),使用一维向量path存储当前路径。遍历二叉树的过程:按前序遍历顺序访问每一个节点。访问每个结点时,将结点添加到路径向量path中。如果当前结点是叶子结点,则判断当前...原创 2020-03-04 15:30:15 · 179 阅读 · 0 评论 -
面试题39:数组中出现次数超过一半的数字
题目数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。你可以假设数组是非空的,并且给定的数组总是存在多数元素。示例 1:输入: [1, 2, 3, 2, 2, 2, 5, 4, 2]输出: 2限制:1 <= 数组长度 <= 50000解法一:哈希表class Solution {public: int majorityElement(vector<int>& nums) { unordered_map<int,in原创 2020-08-24 19:43:28 · 339 阅读 · 0 评论 -
面试题36:二叉搜索树与双向链表
题目描述面试题36:输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。思路调整指针原先指向左子节点的指针调整为链表中指向前一个节点的指针原先指向右子节点的指针调整为链表中指向后一个节点的指针如何调整考虑根节点和左右子树的根本情况,因为如果用递归,这种根本情况考虑就可以去将同样的方法用到左右子树上对于这种基本情况,可...原创 2020-03-05 11:09:04 · 107 阅读 · 0 评论 -
35.复杂链表的复制
题目面试题35:输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)思路/*struct RandomListNode { int label; struct RandomListNode *next, *ran...原创 2020-03-04 19:03:36 · 116 阅读 · 0 评论 -
面试题29:顺时针打印矩阵
题目**面试题29:**输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下4 X 4矩阵: 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.牛客网链接思路用左上和右下的坐标定位出一次要旋转打印的数据,一次旋转打印结束后,往对角分别前进和...原创 2020-03-02 15:25:56 · 79 阅读 · 0 评论 -
面试题28:对称的二叉树
**面试题28:**请实现一个函数,用来判断一颗二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。思路对称的意思是左右边分支相同,且对称分支的孩子值也相同,这就说明该二叉树不能是单边二叉树,每层必须都为满。且每层的各个节点要和对称位置处的节点值相同。/*struct TreeNode { int val; struct TreeNode...原创 2020-03-01 22:24:25 · 167 阅读 · 0 评论 -
面试题27:二叉树的镜像(递归和循环)
题目27:操作给定的二叉树,将其变换为源二叉树的镜像。方法一:递归/*struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) { }};*/class Solution {publ...原创 2020-02-29 15:10:44 · 219 阅读 · 0 评论 -
题目25:合并两个排序的链表
题目25:输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。方法一:递归/*struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next(NULL) { }};*/class Solution {public: ListN...原创 2020-02-29 08:46:50 · 96 阅读 · 0 评论 -
面试题26:树的子结构
题目26:输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)/*struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) { }};*/bool...原创 2020-02-29 12:09:16 · 100 阅读 · 0 评论 -
面试题24:反转链表
面试题24:输入一个链表,反转链表后,输出新链表的表头。方法一:利用三个指针进行反转链表/*struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next(NULL) { }};*/class Solution {public: ListNode* ReverseLi...原创 2020-02-27 23:04:27 · 110 阅读 · 0 评论 -
面试题23.链表中环的入口节点
题目23:给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。思路:设置快慢指针,都从链表头出发,快指针每次走两步,慢指针一次走一步,假如有环,一定相遇于环中某点。从上步骤中相遇节点出发,一边继续向前一边计数,当再次回到该节点时,就可以得到环中总结点数量。初始化两个指针均指向头节点,先让一个节点走环中总结点数量步,接着两个指针以相同速度向链表前每次走一步,最终相遇于...原创 2020-02-27 17:11:00 · 148 阅读 · 0 评论 -
面试题22:链表中倒数第K个节点
面试题22:输入一个链表,输出该链表中倒数第k个结点。/*struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next(NULL) { }};*/class Solution{public: ListNode* FindKthToTail(ListNode* pLis...原创 2020-02-27 10:13:11 · 127 阅读 · 0 评论 -
面试题21:调整数组顺序使奇数位于偶数前面
面试题21:输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。方法一:数组的引用作为实参O(N)class Solution {public: void reOrderArray(vector<int> &array) { //需要对数组进行...原创 2020-02-26 13:30:16 · 168 阅读 · 0 评论 -
面试题20:表示数值的字符串
请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100",“5e2”,"-123",“3.1416"和”-1E-16"都表示数值。 但是"12e",“1a3.14”,“1.2.3”,"±5"和"12e+4.3"都不是。class Solution {public: bool isNumeric(const char* str){ i...原创 2020-02-25 15:39:05 · 182 阅读 · 0 评论 -
正则表达式匹配
T19.请实现一个函数用来匹配包括’.‘和’‘的正则表达式。模式中的字符’.‘表示任意一个字符,而’'表示它前面的字符可以出现任意次(包含0次)。 在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"abaca"匹配,但是与"aa.a"和"ab*a"均不匹配分析:首先,考虑特殊情况:1>两个字符串都为空,返回true2>当第一个字符串不空,...原创 2020-02-25 20:39:55 · 468 阅读 · 0 评论 -
面试题18:在O(1)时间删除链表结点、删除链表中重复的节点
题目:给定单向链表的头指针和一个结点指针,定义一个函数在O(1)时间删除该结点。void DeleteNode(ListNode** pListHead, ListNode* pToBeDeleted) //改变一个变量的值需要传递其地址;改变头指针的值,需要传递头指针的地址{ if(!pListHead || !pToBeDeleted) //如果为空链表,则返回空 ...原创 2020-02-23 19:57:07 · 360 阅读 · 0 评论 -
面试题17:打印1到最大的n位数
输入数字n,按顺序打印从1到最大的n位数。比如输入3,则依次打印1、2、3一直到最大的3位数999字符串解决大数问题最常用也是最容易的方法便是使用字符串或者数组来表示大数。接下来我们用字符串来解决上述问题。用字符串表示很大的整数时,一个很直观的方法便是字符串的每一位都用‘0’~‘9’的字符来填充,用以表示大数的某一位。由于题目要求有n位数,那么我们需要的字符串长度为n+1(字符串最后一位是结...原创 2020-02-23 15:15:43 · 145 阅读 · 0 评论 -
面试题16:数值的整数次方
给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。保证base和exponent不同时为0class Solution{public : double Power(double base, int n) { double res = 1.0,curr = base; int exponent ; ...原创 2020-02-23 11:58:26 · 1113 阅读 · 0 评论 -
面试题15:二进制表示中1的个数
输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。1.常规解法循环次数等于整数二进制的位数。//常规解法class Solution{public: int NumberOf1(int n){ int count = 0; int flag = 1; while (flag){ if (flag...原创 2020-02-22 17:58:07 · 152 阅读 · 1 评论 -
面试题14:剪绳子
给你一根长度为n的绳子,请把绳子剪成整数长的m段(m、n都是整数,n>1并且m>1),每段绳子的长度记为k[0],k[1],…,k[m]。请问k[0]xk[1]x…xk[m]可能的最大乘积是多少?例如,当绳子的长度是8时,我们把它剪成长度分别为2、3、3的三段,此时得到的最大乘积是18。题目分析:先举几个例子,可以看出规律来。4 : 2*25 : 2*36 : 3*37 ...原创 2020-02-22 12:25:46 · 260 阅读 · 0 评论 -
机器人的运动范围
地上有一个m行和n列的方格。一个机器人从坐标0,0的格子开始移动,每一次只能向左,右,上,下四个方向移动一格,但是不能进入行坐标和列坐标的数位之和大于k的格子。 例如,当k为18时,机器人能够进入方格(35,37),因为3+5+3+7 = 18。但是,它不能进入方格(35,38),因为3+5+3+8 = 19。请问该机器人能够达到多少个格子?核心思路:1.从(0,0)开始走,每成功走一步标记当...原创 2020-02-20 15:29:14 · 230 阅读 · 1 评论 -
面试题11:旋转数组中的最小数字
把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。方法一:(o(n))class Solution {public: int minNumberInRotat...原创 2020-02-17 17:13:31 · 123 阅读 · 1 评论 -
面试题9:用两个栈实现队列
用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。/*入队:将元素进栈stack1出队:判断栈stack2是否为空,如果为空,则将栈stack1中所有元素弹出pop,并push进stack2,stack2出栈;如果不为空,栈stack2直接出栈。即:栈A用来作入队列 栈B用来出队列,当栈B为空时,栈A全部出栈到栈B,栈B再出栈(即出队列) *...原创 2020-02-11 18:04:52 · 212 阅读 · 0 评论 -
面试题8:二叉树的下一个节点
T8.给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。思路:(1) 若该节点存在右子树:则下一个节点为右子树最左子节点(如图节点 B )(2) 若该节点不存在右子树:这时分两种情况:2.1 该节点为父节点的左子节点,则下一个节点为其父节点(如图节点 D )2.2 该节点为父节点的右子节点,则沿着父节点...原创 2020-02-11 10:50:41 · 145 阅读 · 0 评论 -
面试题7:重建二叉树
T7.输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。/* * Definition for binary tree * struct TreeNode { * int val; * T...原创 2020-02-10 19:11:27 · 106 阅读 · 0 评论 -
面试题6:从尾到头打印链表
T6 输入一个链表,按链表从尾到头的顺序返回一个ArrayList。方法一:/*** struct ListNode {* int val;* struct ListNode *next;* ListNode(int x) :* val(x), next(NULL) {* }* };*///思...原创 2020-02-10 19:07:57 · 146 阅读 · 0 评论 -
面试题5:替换空格
T5 替换空格请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。方法一:class Solution {public: void replaceSpace(char *str,int length) { int count = 0; //每用一个变量应该...原创 2020-02-10 18:59:01 · 114 阅读 · 0 评论 -
面试题4:二维数组中的查找
面试题4:在一个 n * m 的二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。示例:现有矩阵 matrix 如下:[[1, 4, 7, 11, 15],[2, 5, 8, 12, 19],[3, 6, 9, 16, 22],[10, 13, 14, 1...原创 2020-05-02 11:06:31 · 175 阅读 · 0 评论 -
面试题3:数组中重复的数字
面试题3:找出数组中重复的数字。在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。示例 1:输入:[2, 3, 1, 0, 2, 5, 3]输出:2 或 3限制:2 <= n <= 100000来源:力扣(LeetCode)链接:ht...原创 2020-05-02 07:27:23 · 179 阅读 · 0 评论 -
剑指offer总结
第一次刷刷剑指offer历经两个多月(2020.2~2020.3),由于基础薄弱,现在基本上都忘记了,这一次计划性二刷并进行相应总结。 ------- 2020.5.2于武汉字符...原创 2020-05-02 07:00:10 · 173 阅读 · 0 评论 -
面试题41:数据流中的中位数
面试题41:如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。我们使用Insert()方法读取数据流,使用GetMedian()方法获取当前读取数据的中位数。分析思路用最大堆实现左边的数据容器,因为位于堆顶的就是最大的数据;同理用一个最小堆实现右边的数据容器。...原创 2020-03-08 19:15:46 · 132 阅读 · 0 评论