剑指 offer打卡
ai_XZP_master
本人计算机专业,主要研究人工智能、计算机视觉、物体检测。
展开
-
6.26打卡:剑指 offer两题:和为S的连续正序序列/和为S的两个数字
和为S的连续正序序列 题目描述 小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100。但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数)。没多久,他就得到另一组连续正数和为100的序列:18,19,20,21,22。现在把问题交给你,你能不能也很快的找出所有和为S的连续正数序列? Good Luck! 输出描述 输出所有和为S的连续正数序列。序列内按照从小至大的顺序,序列间按照开始数字从小到大的顺序 思路 题目说的是连续原创 2020-06-26 20:35:37 · 388 阅读 · 0 评论 -
5.25打卡:剑指 offer两题:二叉树的深度/平衡二叉树
二叉树的深度 题目描述 输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。 /* struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) { } };*/ class Solution { public: int Tr原创 2020-05-25 10:48:35 · 314 阅读 · 0 评论 -
5.24打卡:剑指 offer两题:两个链表的第一个公共节点/数字在排序数组中出现的次数
两个链表的第一个公共节点 题目描述 输入两个链表,找出它们的第一个公共结点。(注意因为传入数据是链表,所以错误测试数据的提示是用其他方式显示的,保证传入数据是正确的) 思路:连接两个链表,使两个指针遍历的长度相等,遇到第一个相同的节点返回即可,还有另一种先求出较长的链表,再做遍历其实原理一样,属同种解法。 /* struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next(NULL) {原创 2020-05-24 10:49:05 · 446 阅读 · 0 评论 -
5.22打卡:剑指 offer两题:第一次只出现一次的字符/数组中的逆序对
第一次只出现一次的字符 题目描述 在一个字符串(0<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置, 如果没有则返回 -1(需要区分大小写).(从0开始计数) 思路:设置两个map,一个map保存字符的出现次数,一个map保存每个字符的初始地址。 class Solution { public: int FirstNotRepeatingChar(string str) { if(str.size() <= 0)原创 2020-05-22 11:02:09 · 288 阅读 · 1 评论 -
5.19打卡:剑指 offer两题:把数组排成最小的数/丑数
把数组排成最小的数 题目描述 输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。 思路: 对vector容器内的数据进行排序,按照 将a和b转为string后,若 a+b<b+a,a排在在前的规则排序, 如 2,21 因为 212 < 221 所以 排序后为 21 2。 注:int 转化为 string,使用to_string();string 转 int,使用a原创 2020-05-19 10:46:47 · 223 阅读 · 0 评论 -
5.18打卡:剑指 offer两题:最小k个数/整数1出现的次数
最小k个数 题目描述 输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。 class Solution { public: void AdjustHeap(vector<int> &input, int i, int len){ //i是指从第i个结点开始调整,len是指调整范围0-len int child = 2*i + 1; int temp =原创 2020-05-19 09:46:06 · 193 阅读 · 0 评论 -
5.17打卡:剑指 offer两题:数组中出现次数超过一半的数字/连续子数组最大的和
数组中出现次数超过一半的数字 题目描述 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。 思路:借助哈希表,哈希表的键是数字,值是数字出现的次数。整体流程如下: 遍历数组,统计数字和出现次数 遍历哈希表,返回出现次数超过长度一半的数字 class Solution { public: int MoreThanHalfNum_So原创 2020-05-17 10:42:13 · 224 阅读 · 0 评论 -
5.16打卡:剑指 offer两题:二叉搜索树与双向链表/字符串的排列
二叉搜索树与双向链表 题目描述 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。 思路:通过中序遍历将节点保存下来,这里提供一种递归合并链表的解题思路:递归左右子树,遍历左子树到最后一个节点lastNo,随后将left list root right list拼接起来即可 /* struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right;原创 2020-05-16 12:08:37 · 201 阅读 · 0 评论 -
5.13打卡:剑指 offer两题:复杂链表的复制/二叉搜索树与双向链表
复杂链表的复制 题目描述 输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针random指向一个随机节点),请对此链表进行深拷贝,并返回拷贝后的头结点。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空) 思路: 1、从头节点开始遍历,跟着->next方向建立所有的节点出来,同时用map<label, pisition>记录每个值在链表的什么位置(这里大胆假设每个节点的值都不一样,否则我也没招了,,) 2、此时有了链表雏形,接原创 2020-05-14 10:55:54 · 155 阅读 · 0 评论 -
5.13打卡:剑指 offer两题:二叉搜索树的后序遍历序列/二叉树中和为某一值的路径
二叉搜索树的后序遍历序列 题目描述 输入一个非空整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。 思路:二叉树的后序遍历数组有着什么的特点? 特点:遍历的时候,如果遇到比最后一个元素大的节点,就说明它的前面都比最后一个元素小,该元素后面的所有值都必须大于最后一个值,这两个条件必须都要满足。否则就说明该序列不是二叉树后序遍历。 例子: 2 4 3 6 8 7 5 这是一个正确的后序遍历 这个例子的特点就是:最后一个元素是原创 2020-05-13 12:30:31 · 156 阅读 · 0 评论 -
5.12打卡:剑指 offer两题:栈的压入、弹出序列/从上往下打印二叉树节点
栈的压入、弹出序列 题目描述 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的) class Solution { public: bool IsPopOrder(vector<int> pushV,vector<int>原创 2020-05-12 14:19:59 · 168 阅读 · 0 评论 -
5.11打卡:剑指 offer两题:顺时针打印矩阵/包含min函数的栈
题目描述 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下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-05-11 12:09:10 · 171 阅读 · 0 评论 -
原创 5.10打卡:剑指 offer两题:树的子结构/二叉树镜像
树的子结构 题目描述 输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构) 思路: 根据题意可知,需要一个函数判断树A和树B是否有相同的结构。显然是个递归程序。可考察递归程序3部曲。 递归函数的功能:判断2个数是否有相同的结构,如果相同,返回true,否则返回false 递归终止条件: 如果树B为空,返回true,此时,不管树A是否为空,都为true 否则,如果树B不为空,但是树A为空,返回false,此时B还没空但A空了,显然false 下一步递归参数:原创 2020-05-10 11:30:16 · 136 阅读 · 0 评论 -
原创 5.9打卡:剑指 offer两题:调反转链表/合并两个排序的链表
反转链表 题目描述 输入一个链表,反转链表后,输出新链表的表头。 /* struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next(NULL) { } };*/ class Solution { public: ListNode* ReverseList(ListNode* pHead) { if(pHead == NULL || pHead->next原创 2020-05-09 10:51:05 · 151 阅读 · 0 评论 -
原创 5.5打卡:剑指 offer两题:二进制中1的个数/数值的整数次方
二进制中1的个数 题目描述 输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。 思路:因为n&(n-1)每次都消去最右边的1,最终1全被消去会得到0,所以有几个1就可以进行几次n&(n-1)。 class Solution { public: int NumberOf1(int n) { int count = 0; ...原创 2020-05-05 11:13:15 · 168 阅读 · 0 评论 -
5.4打卡:剑指 offer两题:变态跳台阶/矩形覆盖
变态跳台阶 题目描述 一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。 分析 参考:https://www.nowcoder.com/questionTerminal/22243d016f6b47f2a6928b4313c85387?answerType=1&f=discussion dp 就是可以由什么状态推导出最后的...原创 2020-05-04 10:22:14 · 243 阅读 · 0 评论 -
5.3打卡:剑指 offer两题:斐波那阶数列/跳台阶
斐波那阶数列 题目描述 大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0,第1项是1)。 n<=39 思路: 其实我们可以发现每次就用到了最近的两个数,所以我们可以只存储最近的两个数 sum 存储第 n 项的值 one 存储第 n-1 项的值 two 存储第 n-2 项的值 class Solution { public: ...原创 2020-05-03 10:42:44 · 182 阅读 · 0 评论 -
5.2打卡:剑指 offer两题:用两个栈实现队列/旋转数组最小数字
用两个栈实现队列 题目描述 用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。 思路: 1、当插入时,直接插入 stack1 2、当弹出时,当 stack2 不为空,弹出 stack2 栈顶元素,如果 stack2 为空,将 stack1 中的全部数逐个出栈入栈 stack2,再弹出 stack2 栈顶元素 class Solution { publi...原创 2020-05-02 11:44:21 · 163 阅读 · 0 评论 -
5.1打卡:剑指 offer两题:从尾到头打印链表/重建二叉树
从尾到头打印链表 题目描述 输入一个链表,按链表从尾到头的顺序返回一个ArrayList。 /** * struct ListNode { * int val; * struct ListNode *next; * ListNode(int x) : * val(x), next(NULL) { * } *...原创 2020-05-01 11:10:20 · 147 阅读 · 0 评论 -
4.30打卡:剑指 offer两题:二维数组中的查找/替换空格
二维数组中的查找 题目描述 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。 class Solution { public: bool Find(int target, vector<vector<int> > a...原创 2020-04-30 12:26:23 · 197 阅读 · 0 评论