剑指offer
记录
佛系城
这个作者很懒,什么都没留下…
展开
-
平衡二叉树
【题目描述】 输入一棵二叉树,判断该二叉树是否是平衡二叉树。 在这里,我们只需要考虑其平衡性,不需要考虑其是不是排序二叉树 【代码】 int depth(TreeNode* pRoot) { if(!pRoot) return 0; int l = depth(pRoot->left); if(l == -1) return -1; int r = depth(pRoot->right); if(r原创 2020-05-14 15:15:30 · 71 阅读 · 0 评论 -
求1+2+...+n
【题目描述】 求1+2+3+…+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。 【思路】 利用构造函数和静态变量及函数 【代码】 class Father { public: Father() { n++; sum += n; } static void clear() { n = 0; sum = 0; }原创 2020-05-13 21:59:33 · 206 阅读 · 0 评论 -
数据流中的中位数
【题目描述】 如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。我们使用Insert()方法读取数据流,使用GetMedian()方法获取当前读取数据的中位数。 【思路】 使用大小堆,用优先队列来保存大小两个部分数据 【代码】 class Solution { public: void Insert(int num) { if(small.s原创 2020-05-13 21:31:08 · 74 阅读 · 0 评论 -
二叉树分层打印
【题目描述】 从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。 【思路】 先求二叉树深度,然后按照先序遍历来打印 【代码】 void depth(vector<vector<int>>&vec, TreeNode* root, int h) { if(!root) return; vec[h].push_back(root->val); depth(vec,root-原创 2020-05-13 21:15:05 · 321 阅读 · 0 评论 -
二叉树的下一个结点
【题目描述】 给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。 【思路】 考虑以下情况: 1.如果结点有右子树,那么它的下一个结点就是右子树的最左结点 2.如果结点没有右子树: (1)如果结点是其父节点的左子树,那么它的下一个结点就是其父节点 (2)如果结点是其父节点的右子树,那么就向上一直遍历,直到它是父节点的左子节点的节点,那么这个节点的父节点就是我们需要的 【代码】 TreeLinkNode* GetNext(Tr原创 2020-05-13 20:56:52 · 87 阅读 · 0 评论 -
链表中环的入口
【题目描述】 给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。 【思路】 之前我们判断链表是否有环,用两个指针,快慢指针,一个走一步,一个走两步,在此基础上,当两个指针相遇,此时肯定在环中,那么接着计算环的节点数,就利用相遇节点往前走,直到在次回到相遇点,即可计算环的节点数n,然后利用两个指针同时指向头节点,第一个指针先向前走n个节点,然后两个指针同时向前走,直到两者相遇即为环入口。 【代码】 ListNode* Meet(ListNode* pHead) {原创 2020-05-13 20:28:51 · 80 阅读 · 0 评论 -
判断字符串是否表示数值
【题目描述】 请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100",“5e2”,"-123",“3.1416"和”-1E-16"都表示数值。 但是"12e",“1a3.14”,“1.2.3”,"±5"和"12e+4.3"都不是。 【思路】 找到通用规律A.B[[E|e]C], A.B表示整数加小数,C表示指数,ABC可能为带符号数,然后具体判断看代码 【代码】 //判断数字 bool isUnsignedInt(char** str) { i原创 2020-05-13 18:14:10 · 173 阅读 · 0 评论 -
找到数组中任意一个重复数字
【题目描述】 在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是第一个重复的数字2。 【思路】 暴力法:每个数字与之后的数字对比,直到找到重复数字 查找表:用额外空间保存数组每个元素出现的次数,出现次数大于1,即为重复数,时间复杂度O(n),空间复杂度O(n); 置换法:重头扫描数组,遇到下标为i的数字如果不是i的原创 2020-05-13 17:05:30 · 231 阅读 · 0 评论 -
变态跳台阶
【题目描述】 一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。 【思路】 之前的台阶是一次1或2级,如今可以1~n级,举一反三,那么fn = fn-1+fn-2 + …+f1 + 1 【代码】 int jumpFloorII(int n) { if(n < 3) return n; int res; int sum = 3; for(int i = 3; i <= n;原创 2020-05-13 16:33:41 · 78 阅读 · 0 评论 -
二叉树镜像
【题目描述】 操作给定的二叉树,将其变换为源二叉树的镜像 【思路】 简单的二叉树遍历,交换左右子树即可 【代码】 void Mirror(TreeNode *pRoot) { if(!pRoot) return; if(!pRoot->left && !pRoot->right) return; swap(pRoot->left,pRoot->right); Mirror(pRoot->left);原创 2020-05-13 16:30:14 · 75 阅读 · 0 评论 -
不用加减乘除做加法
【题目描述】 写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。 【思路】 不用“+,-,*,/”,那不就是摆明了用位运算,这时我们可以想到异或和与,两树二进制相加,异或得到的是没有加进位的结果,与得到的是需要进位的结果,如果进位不为0,那么继续异或和与,反之,则为最后相加的结果 【代码】 int Add(int num1, int num2) { int res, carry; do { res =原创 2020-05-13 16:08:36 · 64 阅读 · 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[0] = A[1] * A[2] * … * A[n-1],B[n-1] = A[0] * A[1] * … * A[n-2];) 思路: 暴力法:直接循环n次,每次乘以i以外的所有数字,显然这种方法比较耗时 左右乘积法:用两个数组来分别累积计算乘积, 左数组即从左往右相乘,右数组则从右往左乘积,然后那么原创 2020-05-13 15:39:03 · 88 阅读 · 0 评论