06 2021 档案
摘要:在C++ primer中,第二章第四节的const限定符,对这两个内容是这样定义的: 1、pointer to const 指向常量的指针(所以为什么我们要翻译成指针常量???中文翻译背锅) 与引用一样,也可以令指针指向常量和非常量。类似于常量的引用,指向常量的指针(pointer to const
阅读全文
摘要:若链表中的某个节点,既不是链表头节点,也不是链表尾节点,则称其为该链表的「中间节点」。 假定已知链表的某一个中间节点,请实现一种算法,将该节点从链表中删除。 例如,传入节点 c(位于单向链表 a->b->c->d->e->f 中),将其删除后,剩余链表为 a->b->d->e->f 奇奇怪怪的一道题
阅读全文
摘要:在字符串 s 中找出第一个只出现一次的字符。如果没有,返回一个单空格。 s 只包含小写字母。 很简单,直接遍历字符串,将每一个字符加入哈希表中,然后再遍历字符串,找到哈希表中那个值为1的字符返回即可。 class Solution { public: char firstUniqChar(strin
阅读全文
摘要:请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。 采用双指针和哈希表来解决这道题。最初始的时候,两个指针都指向字符串的首位,然后移动右指针来不断扩大非重复字串的长度,然后将右指针指向的值加入到哈希表中,如果在加入的时候判断到哈希表中某个值重复了(>1),则重复的移动左指
阅读全文
摘要:找出数组中重复的数字。 在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。 很简答的一道题,直接借助哈希表来完成即可。也就是遍历整个数组,将每一个数字都存入哈希表,
阅读全文
摘要:输入整数数组 arr ,找出其中最小的 k 个数。例如,输入4、5、1、6、2、7、3、8这8个数字,则最小的4个数字是1、2、3、4。 最简单的解法,对整个数组进行排序(最好不要直接sort),(这里选择快速排序),然后返回排好序的数组的前k个值即可。 class Solution { publi
阅读全文
摘要:给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。” 特判不为空过后,一定要马上判断root是否等于p或q
阅读全文
摘要:给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。” 根据二叉搜索树的性质,如果左子树存在,则左子树所
阅读全文
摘要:输入一棵二叉树的根节点,求该树的深度。从根节点到叶节点依次经过的节点(含根、叶节点)形成树的一条路径,最长路径的长度为树的深度。 利用dfs算法一直向下找寻,直到根结点后返回。 /** * Definition for a binary tree node. * struct TreeNode {
阅读全文
摘要:给定一棵二叉搜索树,请找出其中第k大的节点。 我们需要明确一点,二叉搜索树的中序遍历即使一个从小到大的序列,所以找出的k大节点的话,我们可以直接对二叉搜索树进行中序遍历后,再来输出第k大即可。 /** * Definition for a binary tree node. * struct Tre
阅读全文
摘要:输入一棵二叉树和一个整数,打印出二叉树中节点值的和为输入整数的所有路径。从树的根节点开始往下一直到叶节点所经过的节点形成一条路径。 这是一个典型的dfs的题目,也就是说我们以一条路走到黑来判断。每遇到一个节点,就判断将该节点加入后和target的差距还有多少。 递归返回的条件为节点为空。当然,如果走
阅读全文
摘要:请实现一个函数按照之字形顺序打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右到左的顺序打印,第三行再按照从左到右的顺序打印,其他行以此类推。 由于需要对偶数层的节点进行反向输出,所以我们想到借助双端队列来完成反向的操作。其他的操作和前两题没什么区别,主要的区别就是奇数层和偶数层对于双端队列
阅读全文
摘要:从上到下按层打印二叉树,同一层的节点按从左到右的顺序打印,每一层打印到一行。(相较于 I 的直接打印到一个数组中,本题的目的是每一层打印到一个数组中,然后合成一个二维数组输出) 所以本题相较于第一题的直接使用一个数组来讲,要稍微难一点。需要利用一个一维数组帮助记录每一层的数据,一个队列来辅助完成遍历
阅读全文
摘要:从上到下打印出二叉树的每个节点,同一层的节点按照从左到右的顺序打印。 涉及到二叉树的打印问题,其实用到递归就好了。但是,递归只能解决前序遍历、中序遍历、后序遍历的打印,不能解决层序遍历的打印。所以从上往下打印二叉树层序遍历的情况下,我们需要借助一个队列来帮助我们解决问题。 队列存在的目的就是保留我们
阅读全文
摘要:请实现一个函数,用来判断一棵二叉树是不是对称的。如果一棵二叉树和它的镜像一样,那么它是对称的。 具体来讲就是加入以根结点为中心画一条垂线,则从垂线往左右两边移动时,遇到的节点的值一定一样。这里需要借助辅助函数来对比左右节点,所以要构建辅助函数。 /** * Definition for a bina
阅读全文
摘要:请完成一个函数,输入一个二叉树,该函数输出它的镜像。 二叉树的问题,基本都靠递归来解决! 所以总体思路是:递归的交换每一个节点的左右子节点,当然后从根部向上交换。 /** * Definition for a binary tree node. * struct TreeNode { * int v
阅读全文
摘要:输入两棵二叉树A和B,判断B是不是A的子结构。(约定空树不是任意一个树的子结构)(注意分辨,树的子树和树的子结构是不一样的!树的子树必须到根结点都满足完全一样,而子结构可以只是子树的一部分) B是A的子结构, 即 A中有出现和B相同的结构和节点值。 例如:给定的树 A: 3 / \ 4 5 / \
阅读全文
摘要:输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。 思路:根据前序遍历找到根结点,然后从中序遍历中找到根结点,则根结点的左边为左子树的值,根结点的右边为右子树的值。然后递归的重建即可。 /** * Definition for a bina
阅读全文
摘要:给定一个数组 nums 和滑动窗口的大小 k,请找出所有滑动窗口里的最大值。 同样的借助双端队列来完成目标。双端队列用于保存当前窗口中的最大值,和最大值后边的比他小的值。如果移动窗口,则首先删除双端队列的队头元素,再添加元素。如果滑动窗口新添加的元素大于双端队列中现存的所有元素,则双端队列只保存这个
阅读全文
摘要:请定义一个队列并实现函数 max_value 得到队列里的最大值,要求函数max_value、push_back 和 pop_front 的均摊时间复杂度都是O(1)。 若队列为空,pop_front 和 max_value 需要返回 -1 本题的难度在于max_value函数的时间复杂度,因为队列
阅读全文
摘要:定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中,调用 min、push 及 pop 的时间复杂度都是 O(1)。 本题的难度在于实现min的时间复杂度为1,题意是当调用min的时候,返回当前栈的最小元素,那么最小元素除非在栈顶,不然遍历栈的时间复杂度肯定不是O(1
阅读全文
摘要:用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返回 -1 ) 如果学过一点基础的数据结构的话,我们可以知道队列和栈是两个不同的概念。 队列
阅读全文
摘要:给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == val 的节点,并返回 新的头节点 。 这一道题和剑指offer.18删除链表的结点不同,本题是存在多个需要删除的节点,而offer.18则只有一个节点需要删除,所以删除后直接跳出循环即可。而本题需
阅读全文
摘要:给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点,返回 null 。 三种方法:1、暴力遍历 2、双指针(建议) 3、哈希表 1、暴力遍历 特判:如果两个链表其中一个为空,则返回空 思想:利用两个指针,A指针指向一条链表的一个节点,B
阅读全文
摘要:请实现 copyRandomList 函数,复制一个复杂链表。在复杂链表中,每个节点除了有一个 next 指针指向下一个节点,还有一个 random 指针指向链表中的任意节点或者 null。 本题主要的难点就是random指针不好理解。 第一种方法:采用哈希表来解决。首先定义一个指针和一个哈希表,指
阅读全文
摘要:定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。 又回到最初的起点啊,链表问题,多画图,慢慢思考。 第一种方法最简单的双指针解法。首先申明两个指针,pre指向头节点,cur指向nullptr(原链表的尾部)。当pre不为空的时候,保存pre的下一个结点(因为局部反转后指向关系
阅读全文
摘要:输入一个链表,输出该链表中倒数第k个节点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个节点。 例如,一个链表有 6 个节点,从头节点开始,它们的值依次是 1、2、3、4、5、6。这个链表的倒数第 3 个节点是值为 4 的节点。 最简单的方法:前后双指针。前指针先向前走k步,然
阅读全文
摘要:给定单向链表的头指针和一个要删除的节点的值,定义一个函数删除该节点。 返回删除后的链表的头节点。(注意此题说明了只删除一个结点) 最常规的方法:单指针。总体思想是,如果当前节点的下一个节点为要删除的节点,则当前节点的下一个节点变为删除前下一个节点的下一个节点。 /** * Definition fo
阅读全文
摘要:输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。 我有三种方法弄死他!三种! 第一种方法:回溯算法。大体的思想就是只要链表的头节点没有到最后,就一直重复的调用下一位。直到头节点到最后的位置,然后就返回上一层,并将当前结点的值压入数组。 1 /** 2 * Definition f
阅读全文

浙公网安备 33010602011771号