剑指offer
学习剑指offer的记录
一颗向风的蒲公英
这个作者很懒,什么都没留下…
展开
-
24反转链表
定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。原创 2023-02-07 10:41:24 · 55 阅读 · 0 评论 -
22链表中倒数第k个节点
例如,一个链表有 6 个节点,从头节点开始,它们的值依次是 1、2、3、4、5、6。这个链表的倒数第 3 个节点是值为 4 的节点。输入一个链表,输出该链表中倒数第k个节点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个节点。定义两个指针,一个是快指针,一个是慢指针,都指向头节点。像找出倒数第k个节点,中位点,都采用双指针。原创 2023-02-07 10:21:27 · 42 阅读 · 0 评论 -
19.正则表达式匹配
表示它前面的字符可以出现任意次(含0次)。在本题中,匹配是指字符串的所有字符匹配整个模式。请实现一个函数用来匹配包含。表示任意一个字符,而。原创 2023-02-07 10:15:34 · 70 阅读 · 0 评论 -
68-I二叉搜索树的最近公共祖先
百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。判断p,q与root的值的判断,不断缩小搜索范围。原创 2023-02-17 10:38:45 · 55 阅读 · 0 评论 -
64.求1+2+...+n
n ,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?在“出口”时,采用与或门。原创 2023-02-17 10:27:59 · 63 阅读 · 0 评论 -
63.股票的最大利润
假设把某股票的价格按照时间先后顺序存储在数组中,请问买卖该股票一次可能获得的最大利润是多少?方法二:只遍历一遍,在“最低点”买入,“最高点”卖出。原创 2023-02-17 10:21:21 · 47 阅读 · 0 评论 -
61.扑克牌中的顺子
从若干副扑克牌中随机抽5张牌,判断是不是一个顺子,即这5张牌是不是连续的。2~10为数字本身,A为1,J为11,Q为12,K为13,而大、小王为0,可以看成任意数字。原创 2023-02-17 10:12:17 · 90 阅读 · 0 评论 -
62.圆圈中最后剩下的数字
0,1,···,n-1这n个数字排成一个圆圈,从数字0开始,每次从这个圆圈里删除第m个数字(删除后从下一个数字开始计数)。求出这个圆圈里剩下的最后一个数字。,0、1、2、3、4这5个数字组成一个圆圈,从数字0开始每次删除第3个数字,则删除的前4个数字依次是2、0、4、1,因此最后剩下的数字是3。思路:每次删除了某个数后,就对这些数重新进行编号。f(n,m):表示数的总数为n时,剩下的数是多少。难点:找出f(n,m)与f(n-1,m)的关系。方法一:采用循环链表,对其进行遍历删除。原创 2023-02-17 09:54:53 · 54 阅读 · 0 评论 -
60.n个骰子的点数
你需要用一个浮点数数组返回答案,其中第 i 个元素代表这 n 个骰子所能掷出的点数集合中第 i 小的那个的概率。把n个骰子扔在地上,所有骰子朝上一面的点数之和为s。输入n,打印出s的所有可能的值出现的概率。有n个骰子,就有6^n种组合,s=[n,6n],求k / 6^n。原创 2023-02-17 09:42:42 · 53 阅读 · 0 评论 -
59-I滑动窗口的最大值
遍历数组时,把可能成为最大值的元素的下标存入到队列中,如果队尾元素比新加入的元素的值小,就把队尾元素剔除。给定一个数组 nums 和滑动窗口的大小 k,请找出所有滑动窗口里的最大值。采用队列和数组的结合,队列存放那些可能成为最大值的元素的下标。原创 2023-02-17 09:27:01 · 48 阅读 · 0 评论 -
58-II左旋转字符串
字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。比如,输入字符串"abcdefg"和数字2,该函数将返回左旋转两位得到的结果"cdefgab"。对前k个进行逆置,对后n-k个进行逆置,对整个字符串进行逆置。原创 2023-02-16 10:54:22 · 46 阅读 · 0 评论 -
58-I翻转单词顺序
输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。为简单起见,标点符号和普通字母一样处理。例如输入字符串"I am a student. “,则输出"student. a am I”。原创 2023-02-16 10:44:33 · 63 阅读 · 0 评论 -
57-II和为s的连续正整数序列
输入一个正整数 target ,输出所有和为 target 的连续正整数序列(至少含有两个数)。序列内的数字由小到大排列,不同序列按照首个数字从小到大排列。原创 2023-02-16 10:37:52 · 56 阅读 · 0 评论 -
57-I和为s的两个数字
输入一个递增排序的数组和一个数字s,在数组中查找两个数,使得它们的和正好是s。如果有多对数字的和等于s,则输出任意一对即可。比如可以先固定一个值,算出它和target的一个差值,然后再在另一部分进行二分查找这个差值。定义两个指针i,j,i指向左边,j指向右边。方法一:采用二分查找。原创 2023-02-16 10:25:44 · 49 阅读 · 0 评论 -
56-II数组中数字出现的次数
在一个数组 nums 中除一个数字只出现一次之外,其他数字都出现了三次。请找出那个只出现一次的数字。因此,统计所有数字的各二进制位中 11 的出现次数,并对 33 求余,结果则为只出现一次的数字。考虑数字的二进制形式,对于出现三次的数字,各 二进制位 出现的次数都是 33 的倍数。原创 2023-02-16 10:08:27 · 46 阅读 · 0 评论 -
56-I数组中数字出现的次数
一个整型数组 nums 里除两个数字之外,其他数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)。原创 2023-02-16 09:59:55 · 48 阅读 · 0 评论 -
55-II平衡二叉树
输入一棵二叉树的根节点,判断该树是不是平衡二叉树。如果某二叉树中任意节点的左右子树的深度相差不超过1,那么它就是一棵平衡二叉树。递归判断非叶节点左右子树的高度之差,若相差不超过1,那么它就是一棵平衡二叉树;因为上面的题解中在计算深度和判断平衡的时候重复计算了树的高度;原创 2023-02-16 09:30:28 · 77 阅读 · 0 评论 -
55-I二叉树的深度
输入一棵二叉树的根节点,求该树的深度。从根节点到叶节点依次经过的节点(含根、叶节点)形成树的一条路径,最长路径的长度为树的深度。原创 2023-02-16 09:16:23 · 36 阅读 · 0 评论 -
54.二叉搜索树的第k大节点
若求第k小节点,可直接采用中序遍历,因为中序遍历得到的是一个有序的序列:左 根 右 从小到大排序的。而这道题所求是第k大节点,可以稍微改造一下,将其遍历顺序改为 右 根 左 就变成从大到小的顺序了。给定一棵二叉搜索树,请找出其中第 k 大的节点的值。原创 2023-02-16 09:13:03 · 49 阅读 · 0 评论 -
53-II 0~n-1种缺失的数字
一个长度为n-1的递增排序数组中的所有数字都是唯一的,并且每个数字都在范围0~n-1之内。在范围0~n-1内的n个数字中有且只有一个数字不在该数组中,请找出这个数字。遍历数组,若数组元素和下标i不一致,i即为所求。二分查找,判断的依据是下标和值是否是相等的。原创 2023-02-16 09:00:12 · 51 阅读 · 0 评论 -
53-I在排序数组种查找数字i
找到第一个目标值和最后一个目标值所求即为right-left+1。统计一个数字在排序数组中出现的次数。原创 2023-02-15 13:55:41 · 49 阅读 · 0 评论 -
52.两个链表的第一个公共节点
遍历两个链表,先求出两个链表的长度len1和len2,让长的链表先移到|len1-len2|个节点;再让两个链表同时移到,寻找第一个公共节点。输入两个链表,找出它们的第一个公共节点。原创 2023-02-15 13:42:45 · 47 阅读 · 0 评论 -
51.数组种的逆序对
在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。在冒泡排序种一个交换了多少次就有多少对逆序对。时间复杂度O(N^2)原创 2023-02-15 13:26:07 · 46 阅读 · 0 评论 -
50.第一次只出现一次的字符
在字符串 s 中找出第一个只出现一次的字符。如果没有,返回一个单空格。s 只包含小写字母。原创 2023-02-15 13:09:42 · 47 阅读 · 0 评论 -
49.丑数
我们把只包含质因子 2、3 和 5 的数称作丑数(Ugly Number)。求按从小到大的顺序的第 n 个丑数。原创 2023-02-15 12:43:55 · 39 阅读 · 0 评论 -
48.最长不含重复字符的子字符串
请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。原创 2023-02-15 12:35:44 · 52 阅读 · 0 评论 -
47.礼物的最大价值
在一个 m*n 的棋盘的每一格都放有一个礼物,每个礼物都有一定的价值(价值大于 0)。你可以从棋盘的左上角开始拿格子里的礼物,并每次向右或者向下移动一格、直到到达棋盘的右下角。给定一个棋盘及其上面的礼物的价值,请计算你最多能拿到多少价值的礼物?空间优化:将二维dp数组转为一维dp数组。采用动态规划,二维dp。原创 2023-02-15 12:22:31 · 59 阅读 · 0 评论 -
46.把数字翻译成字符串
给定一个数字,我们按照如下规则把它翻译为字符串:0 翻译成 “a” ,1 翻译成 “b”,……,11 翻译成 “l”,……,25 翻译成 “z”。一个数字可能有多个翻译。请编程实现一个函数,用来计算一个数字有多少种不同的翻译方法。首先把数字转换成数组。原创 2023-02-15 12:06:12 · 104 阅读 · 0 评论 -
45把数组排成最小的数
nums是一个肺腑整数数组,把数组里所有数字拼接起来排成一个数,打印能拼出的所有数中最小的一个。对数组进行排序,只是比较两个数的“大小”有所不同,所求为最小,则按递增顺序排序。若xy>yx,则x大于y。原创 2023-02-15 11:52:24 · 50 阅读 · 0 评论 -
44.数字序列中某一位的数字
数字以0123456789101112131415…的格式序列化到一个字符序列中。在这个序列中,第5位(从下标0开始计数)是5,第13位是1,第19位是4,等等。先求出它是处于哪一个范围之内的;之后,再定位它具体是哪一个数字;再定位它是哪一个数字中的哪一位。num=bit+(n-1)/i【n是处理之后的数】请写一个函数,求任意第n位对应的数字。原创 2023-02-15 11:20:12 · 65 阅读 · 0 评论 -
43.1~n整数中1出现的次数
例如,输入12,1~12这些整数中包含1 的数字有1、10、11和12,1一共出现了5次。输入一个整数 n ,求1~n这n个整数的十进制表示中1出现的次数。前3位为高位上的数,低2位为低位数。原创 2023-02-14 11:25:51 · 46 阅读 · 0 评论 -
42.连续子数组的最大和
输入一个整型数组,数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。要求时间复杂度为O(n)。优化空间复杂度为O(1)时间复杂度:O(N)空间复杂度:O(N)原创 2023-02-14 11:12:32 · 44 阅读 · 0 评论 -
41.数据流中的数
如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。此时求中位数就简单了,若是偶数,则将两个堆的堆顶元素相加平均即可;若是奇数,规定大根堆多保存一个数,则就是大根堆的堆顶元素。设置两个堆,一个是大根堆,一个是小根堆;大根堆保存较小的那一部分数,小根堆保存较大的那一部分数,各保存n/2个数。当n是偶数时,就把元素添加到小根堆里,再把小根堆堆顶元素放在大根堆。当n是奇数时,就把元素添加到大根堆里,再把大根堆堆顶元素放在小根堆。[2,3,4] 的中位数是 3。原创 2023-02-14 10:57:32 · 54 阅读 · 0 评论 -
40.最小的k个数
输入整数数组 arr ,找出其中最小的 k 个数。例如,输入4、5、1、6、2、7、3、8这8个数字,则最小的4个数字是1、2、3、4。原创 2023-02-14 10:37:51 · 45 阅读 · 0 评论 -
36.二叉搜索树和双向链表
就地完成转换操作。当转化完成以后,树中节点的左指针需要指向前驱,树中节点的右指针需要指向后继。还需要返回链表中的第一个节点的指针。输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的循环双向链表。要求不能创建任何新的节点,只能调整树中节点指针的指向。原创 2023-02-13 09:34:09 · 46 阅读 · 0 评论 -
37.序列化二叉树
你需要设计一个算法来实现二叉树的序列化与反序列化。这里不限定你的序列 / 反序列化算法执行逻辑,你只需要保证一个二叉树可以被序列化为一个字符串并且将这个字符串反序列化为原始的树结构。输入:root = [1,2,3,null,null,4,5]请实现两个函数,分别用来序列化和反序列化二叉树。输出:[1,2,3,null,null,4,5]原创 2023-02-13 09:56:16 · 49 阅读 · 0 评论 -
38.字符串的排序
你可以以任意顺序返回这个字符串数组,但里面不能有重复元素。输入一个字符串,打印出该字符串中字符的所有排列。因为不能含重复的字母,首先要去重。本质是全排列,采用构建n叉树。原创 2023-02-13 10:19:45 · 51 阅读 · 0 评论 -
39.数组中出现次数超过一半的数字
方法一:采用哈希表。一开始可以遍历这样一个数组;然后将其存入哈希表里,并且记录每个数出现的次数;最后再遍历哈希表,如果有数出现的次数超过n/2,那就是众数,即为所求。数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。你可以假设数组是非空的,并且给定的数组总是存在多数元素。对数组进行排序,中位数即为众数。方法三:摩尔投票法【最优解】原创 2023-02-13 10:30:00 · 66 阅读 · 0 评论 -
20.表示数值的字符串
2) 至少一位数字,后面跟着一个点 ‘.’ ,后面再跟着至少一位数字。请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。1.(可选)一个符号字符(‘+’ 或 ‘-’)1.(可选)一个符号字符(‘+’ 或 ‘-’)3)一个点 ‘.’ ,后面跟着至少一位数字。1)至少一位数字,后面跟着一个点 ‘.’(按顺序)可以分成以下几个部分。原创 2023-02-06 12:14:01 · 33 阅读 · 0 评论 -
21.调整数组的顺序使奇数位于偶数的前面
输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数在数组的前半部分,所有偶数在数组的后半部分。原创 2023-02-06 11:53:37 · 46 阅读 · 0 评论