剑指OFFER
刷题思考和总结
Amor@Fati
这个作者很懒,什么都没留下…
展开
-
二叉树的镜像——《剑指offer》
题目描述 请完成一个函数,输入一个二叉树,该函数输出它的镜像。 例如输入: 4 / \ 2 7 / \ / \ 1 3 6 9 镜像输出: 4 / \ 7 2 / \ / \ 9 6 31 示例 1: 输入:root = [4,2,7,1,3,6,9] 输出:[4,7,2,9,6,3,1] 限制: 0 <= 节点个数 <= 1000 代码实现 class Solution ...原创 2022-05-14 16:41:03 · 89 阅读 · 0 评论 -
顺时针打印矩阵——《剑指offer》
图的邻接链表法存储法 struct edgeNode { int adjver; //边指向终端结点的下标,vertex顶点,adjoin邻接 int weight; //权值 edgeNode*next; //指向下一边结点的指针 }; struct vertexNode { int data; //顶点上的数据域 int index; //顶点在图中数组的下标,例:0,1,2,3 edgeNode* first; //指向该顶点作为出发点的边链表 }; struc原创 2022-05-14 16:03:31 · 176 阅读 · 0 评论 -
包含main函数的栈——《剑指offer》
题目描述 定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中,调用 min、push 及 pop 的时间复杂度都是 O(1)。 示例: MinStack minStack = new MinStack(); minStack.push(-2); minStack.push(0); minStack.push(-3); minStack.min(); --> 返回 -3. minStack.pop(); minStack.top(); -->...原创 2022-05-14 13:28:47 · 224 阅读 · 0 评论 -
合并两个排序的链表——《剑指offer》
题目描述 输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是递增排序的。 示例1: 输入:1->2->4, 1->3->4 输出:1->1->2->3->4->4 限制: 0 <= 链表长度 <= 1000 思想 每次从两个链表中选择头结点元素最小的那个结点作为合并后的根结点。 代码实现 class Solution { public: ListNode* mergeTwoLists(ListNode*原创 2022-05-08 15:36:16 · 105 阅读 · 0 评论 -
链表中入口结点——《剑指offer》
题目描述 给一个长度为n链表,若其中包含环,请找出该链表的环的入口结点,否则,返回null。 数据范围:n\le10000n≤10000,1<=结点值<=100001<=结点值<=10000 要求:空间复杂度O(1)O(1),时间复杂度O(n)O(n) 例如,输入{1,2},{3,4,5}时,对应的环形链表如下图所示: 可以看到环的入口结点的结点值为3,所以返回结点值为3的结点。 输入描述: 输入分为2段,第一段是入环前的链表部分,第二段是链表环的部分...原创 2022-05-07 14:46:19 · 63 阅读 · 0 评论 -
反转链表——《剑指offer》
题目描述 定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。 示例: 输入: 1->2->3->4->5->NULL 输出: 5->4->3->2->1->NULL 限制: 0 <= 节点个数 <= 5000 思想 就是多设几个指针,分别表示当前结点,当前节点的前一个结点,当前结点的后一个结点,反转后的头结点。 代码实现 class Solution { public: List.原创 2022-05-07 14:02:39 · 251 阅读 · 0 评论 -
链表中倒数第k个结点——《剑指offer》
题目描述 输入一个链表,输出该链表中倒数第k个节点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个节点。 例如,一个链表有 6 个节点,从头节点开始,它们的值依次是 1、2、3、4、5、6。这个链表的倒数第 3 个节点是值为 4 的节点。 示例: 给定一个链表: 1->2->3->4->5, 和 k = 2. 返回链表 4->5. 思想 设置两个指针同时前进。 代码实现 class Solution { public: Li原创 2022-05-05 13:20:51 · 43 阅读 · 0 评论 -
表示数值的字符串——《剑指offer》
题目描述 请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。 数值(按顺序)可以分成以下几个部分: 若干空格 一个小数或者整数 (可选)一个'e'或'E',后面跟着一个整数 若干空格 小数(按顺序)可以分成以下几个部分: (可选)一个符号字符('+' 或 '-') 下述格式之一: 至少一位数字,后面跟着一个点 '.' 至少一位数字,后面跟着一个点 '.' ,后面再跟着至少一位数字 一个点 '.' ,后面跟着至少一位数字 整数(按顺序)可以分成以下几个部分: (可选)一个符...原创 2022-05-03 01:10:09 · 49 阅读 · 0 评论 -
正则表达式匹配——《剑指offer》
题目描述 请实现一个函数用来匹配包含'. '和'*'的正则表达式。模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(含0次)。在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"ab*ac*a"匹配,但与"aa.a"和"ab*a"均不匹配。 示例 1: 输入: s = "aa" p = "a" 输出: false 解释: "a" 无法匹配 "aa" 整个字符串。 示例 2: 输入: s = "aa" p = "a*" 输出: true原创 2022-05-01 19:55:46 · 56 阅读 · 0 评论 -
删除链表的结点——《剑指offer》
题目描述 给定单向链表的头指针和一个要删除的节点的值,定义一个函数删除该节点。 返回删除后的链表的头节点。 注意:此题对比原题有改动 示例 1: 输入: head = [4,5,1,9], val = 5 输出: [4,1,9] 解释: 给定你链表中值为5的第二个节点,那么在调用了你的函数之后,该链表应变为 4 -> 1 -> 9. 示例 2: 输入: head = [4,5,1,9], val = 1 输出: [4,5,9] 解释: 给定你链表中值为1的第三个节点,那么在调...原创 2022-04-30 17:07:37 · 59 阅读 · 0 评论 -
打印从1到最大的n位数——《剑指offer》
题目描述 输入数字 n,按顺序打印出从 1 到最大的 n 位十进制数。比如输入 3,则打印出 1、2、3 一直到最大的 3 位数 999。 示例 1: 输入: n = 1 输出: [1,2,3,4,5,6,7,8,9] 说明: 用返回一个整数列表来代替打印 n 为正整数 C++代码实现 class Solution { public: vector<int> printNumbers(int n) { vector<int> arr; .原创 2022-04-29 15:46:34 · 1708 阅读 · 0 评论 -
数字的整数次方——《剑指offer》
题目描述 实现 pow(x, n) ,即计算 x 的 n 次幂函数(即,xn)。不得使用库函数,同时不需要考虑大数问题。 示例 1: 输入:x = 2.00000, n = 10 输出:1024.00000 示例 2: 输入:x = 2.10000, n = 3 输出:9.26100 示例 3: 输入:x = 2.00000, n = -2 输出:0.25000 解释:2-2 = 1/22 = 1/4 = 0.25 C++代码实现 class Solution { public: .原创 2022-04-28 15:37:06 · 1474 阅读 · 0 评论 -
二进制中1的个数——《剑指offer》
题目描述 编写一个函数,输入是一个无符号整数(以二进制串的形式),返回其二进制表达式中数字位数为 ‘1’ 的个数(也被称为 汉明重量).)。 提示: 请注意,在某些语言(如 Java)中,没有无符号整数类型。在这种情况下,输入和输出都将被指定为有符号整数类型,并且不应影响您的实现,因为无论整数是有符号的还是无符号的,其内部的二进制表示形式都是相同的。 在 Java 中,编译器使用 二进制补码 记法来表示有符号整数。因此,在上面的 示例 3 中,输入表示有符号整数 -3。 示例 1: 输入:n = 11 (控原创 2022-04-27 14:38:43 · 51 阅读 · 0 评论 -
剪绳子——《剑指offer》
问题描述 给你一根长度为 n 的绳子,请把绳子剪成整数长度的 m 段(m、n都是整数,n>1并且m>1),每段绳子的长度记为 k[0],k[1]…k[m-1] 。请问 k[0]k[1]…*k[m-1] 可能的最大乘积是多少?例如,当绳子的长度是8时,我们把它剪成长度分别为2、3、3的三段,此时得到的最大乘积是18。 示例 1: 输入: 2 输出: 1 解释: 2 = 1 + 1, 1 × 1 = 1 示例 2: 输入: 10 输出: 36 解释: 10 = 3 + 3 + 4, 3 × 3 ×原创 2022-04-26 14:57:29 · 42 阅读 · 0 评论 -
机器人的运动范围——《剑指offer》
题目描述 地上有一个m行n列的方格,从坐标 [0,0] 到坐标 [m-1,n-1] 。一个机器人从坐标 [0, 0] 的格子开始移动,它每次可以向左、右、上、下移动一格(不能移动到方格外),也不能进入行坐标和列坐标的数位之和大于k的格子。例如,当k为18时,机器人能够进入方格 [35, 37] ,因为3+5+3+7=18。但它不能进入方格 [35, 38],因为3+5+3+8=19。请问该机器人能够到达多少个格子? 示例 1: 输入:m = 2, n = 3, k = 1 输出:3 示例 2: 输入:m =原创 2022-04-25 14:12:25 · 61 阅读 · 0 评论 -
矩阵中的路径
问题描述 给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中,返回 true ;否则,返回 false 。 单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。 例如,在下面的 3×4 的矩阵中包含单词 “ABCCED”(单词中的字母已标出)。 示例 1: 输入:board = [[“A”,“B”,“C”,“E”],[“S”,“F”,“C”,“S”],[“A”,“原创 2022-04-24 16:36:27 · 980 阅读 · 0 评论 -
青蛙跳台阶问题——《剑指offer》
问题描述 一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶。求该青蛙跳上一个 n 级的台阶总共有多少种跳法。 答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。 示例 1: 输入:n = 2 输出:2 示例 2: 输入:n = 7 输出:21 示例 3: 输入:n = 0 输出:1 提示: 0 <= n <= 100 思想 从第三个台阶开始,每台阶可以从它的前一个台阶或者前两个台阶跳过去。那么这个台阶的跳法种数就是前两个个台阶原创 2022-04-22 14:52:36 · 1098 阅读 · 0 评论 -
斐波那契数列——《剑指offer》
题目描述 写一个函数,输入 n ,求斐波那契(Fibonacci)数列的第 n 项(即 F(N))。斐波那契数列的定义如下: F(0) = 0,F(1)= 1 F(N) = F(N - 1) + F(N - 2), 其中 N > 1. 斐波那契数列由 0 和 1 开始,之后的斐波那契数就是由之前的两数相加而得出。 答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。 示例 1: 输入:n = 2 输出:1 示例 2: 输入:n ...原创 2022-04-21 16:07:03 · 826 阅读 · 0 评论 -
用两个栈实现队列——《剑指offer》
题目描述: 用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead操作返回 -1 ) 示例 1: 输入: ["CQueue","appendTail","deleteHead","deleteHead"] [[],[3],[],[]] 输出:[null,null,3,-1] 示例 2: 输入: ["CQueue","deleteH.原创 2022-04-20 17:12:53 · 50 阅读 · 0 评论 -
重建二叉树——《剑指offer》
题目描述: 输入某二叉树的前序遍历和中序遍历的结果,请构建该二叉树并返回其根节点。 假设输入的前序遍历和中序遍历的结果中都不含重复的数字。 示例 1: Input: preorder = [3,9,20,15,7], inorder = [9,3,15,20,7] Output: [3,9,20,null,null,15,7] 示例 2: Input: preorder = [-1], inorder = [-1] Output: [-1] 限制: 0 <.原创 2022-04-18 16:07:49 · 808 阅读 · 0 评论 -
从尾到头打印链表——《剑指offer》
题目描述: 输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。 示例 1: 输入:head = [1,3,2] 输出:[2,3,1] 限制: 0 <= 链表长度 <= 10000 思想:遍历链表只能从头到尾,但可以利用栈的“先进后出”特点实现从尾到头输出数据。即先遍历一遍链表,将结点上的值按序压入栈中,然后再将栈中的元素依次出栈。 C++实现: /** * Definition for singly-linke..原创 2022-04-17 13:01:00 · 813 阅读 · 0 评论 -
替换空格——《剑指offer》
题目描述: 请实现一个函数,把字符串 s 中的每个空格替换成"%20"。 示例 1: 输入:s = "We are happy." 输出:"We%20are%20happy." 限制: 0 <= s 的长度 <= 10000 代码实现:这是时间复杂度为O(n)的实现。首先遍历一趟,确定替换后新数组的长度。然后分别从原始和新数组的末尾进行赋值,遇到空格就替换成%20。 class Solution { public: string re.原创 2022-04-16 17:02:09 · 702 阅读 · 0 评论 -
数组中重复的数——《剑指offer》
题目描述: 找出数组中重复的数字。 在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。 示例 1: 输入: [2, 3, 1, 0, 2, 5, 3] 输出:2 或 3 限制: 2 <= n <= 100000 代码实现: class Solution { public: int findRe...原创 2022-04-15 17:21:04 · 674 阅读 · 0 评论 -
二维数组中的查找——《剑指OFFER》
二维数组中的查找——剑指OFFER原创 2022-04-14 17:25:00 · 367 阅读 · 0 评论