剑指offer
蛮夷小王爷
普通硕士一枚
展开
-
剑指offer#56.数组中只出现一次的数字 && 56 - II. 数组中数字出现的次数 II
数组中只出现一次的数字:一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。思路:首先如果只有一个数字,可以通过异或全体数字得到唯一一个不同的数字,但现在有两个数字,需要找一种方法拆分成两个数组,然后再异或,我们可以通过先异或整个数组得到两个不同数字相互异或的结果,该结果中必然有一位为1,找出该位,将数组按照该位为1拆分成两个数组,分别异或即可得到两个不同...原创 2020-04-08 12:50:25 · 94 阅读 · 0 评论 -
剑指offer#55.二叉树的深度、平衡二叉树
二叉树的深度:输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。/*struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL...原创 2020-04-07 15:14:06 · 69 阅读 · 0 评论 -
剑指offer#54.二叉搜索树的第k大节点
二叉搜索树的第k大节点:给定一棵二叉搜索树,请找出其中的第k小的结点。例如, (5,3,7,2,4,6,8) 中,按结点数值大小顺序第三小结点的值为4。中序遍历/*struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : ...原创 2020-04-07 14:59:04 · 69 阅读 · 0 评论 -
剑指offer#53.数字在排序数组中出现的次数 && II. 0~n-1中缺失的数字
数字在排序数组中出现的次数:统计一个数字在排序数组中出现的次数。思路:因为数组中已经排好序,所以立刻可以想到用二分查找,但是二分查找只能查找到一个数,所以查完以后要向左向右去找出分别的第一个和最后一个k,然后得到次数,这样的复杂度为O(n),因此我们需要改进一下,修改二分查找找出第一个数和最后一个数,就可以使复杂度变成O(logN),如何判断第一个数呢,只要找到的这个数下标是0或者不为0,则与其...原创 2020-03-30 15:52:49 · 127 阅读 · 0 评论 -
剑指offer#52.两个链表的公共结点
两个链表的公共结点:输入两个链表,找出它们的第一个公共结点。(注意因为传入数据是链表,所以错误测试数据的提示是用其他方式显示的,保证传入数据是正确的)解法一:可以暴力,没遍历第一个链表一个结点就遍历第二个链表整个链表来判断是否是公共结点O(N^2)解法二:先遍历一个链表,将其存入Map中,然后遍历另一个链表,从map中查找是不是公共结点,返回第一个公共结点O(M+N),O(n)解法三:先遍历...原创 2020-03-28 10:51:54 · 68 阅读 · 0 评论 -
剑指offer#51.数组中的逆序对
数组中的逆序对:在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出。 即输出P%1000000007思路:归并排序,将数组不断砍成两半进行递归,然后merge,在merge中归并的时候顺便计算逆序对的数量,用long long型。class Solution {public:...原创 2020-03-27 23:51:43 · 146 阅读 · 0 评论 -
剑指offer#50.第一个只出现一次的字符
第一个只出现一次的字符:在一个字符串(0<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置, 如果没有则返回 -1(需要区分大小写).遍历两遍,第一遍用来记录出现的次数,第二遍找出第一个只出现一次的字符即可class Solution {public: int FirstNotRepeatingChar(string str) {...原创 2020-03-27 10:18:23 · 90 阅读 · 0 评论 -
剑指offer#49.丑数
丑数:把只包含质因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含质因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。解法一:暴力枚举每一个数,反复除2,3,5之后为1的就是丑数,否则就不是丑数解法二:用数组保存丑数,用下标标记当前某个数的2,3,5倍小于当前的最大的当前丑数,那么就取这几个下标对应数的2,3,5倍中最小的即...原创 2020-03-27 09:58:08 · 53 阅读 · 0 评论 -
剑指offer#48.最长不含重复字符的子字符串
最长不含重复字符的子字符串:请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。思路:动态规划,将f(i)表示以i元素结尾的最长子字符串是多大,计算i与前一个与i元素相同的字母之间的长度d,如果d小于f(i-1)说明i相同的元素出现再f(i-1)内,则f(i) = d,如果d大于f(i-1),说明i相同元素出现在f(i-1)外,但是f(i-1)自然有另一个相同字母,因此...原创 2020-03-26 15:31:45 · 66 阅读 · 0 评论 -
剑指offer#47.礼物的最大价值
礼物的最大价值:在一个 m*n 的棋盘的每一格都放有一个礼物,每个礼物都有一定的价值(价值大于 0)。你可以从棋盘的左上角开始拿格子里的礼物,并每次向右或者向下移动一格、直到到达棋盘的右下角。给定一个棋盘及其上面的礼物的价值,请计算你最多能拿到多少价值的礼物?来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/li-wu-de-zui-da-j...原创 2020-03-26 14:08:32 · 113 阅读 · 0 评论 -
剑指offer#46.把数字翻译成字符串
把数字翻译成字符串:给定一个数字,我们按照如下规则把它翻译为字符串:0 翻译成 “a” ,1 翻译成 “b”,……,11 翻译成 “l”,……,25 翻译成 “z”。一个数字可能有多个翻译。请编程实现一个函数,用来计算一个数字有多少种不同的翻译方法。来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/ba-shu-zi-fan-yi-cheng...原创 2020-03-25 14:18:29 · 76 阅读 · 0 评论 -
剑指offer#45.把数组排成最小的数
把数组排成最小的数:输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。思路:利用贪心算法,对于前后数n和m,我们比较nm和mn的大小关系,小的放前面,大的放后面,利用快速排序即可排成最小的数,贪心算法需要证明…注意sort函数第三个参数是函数指针,但该函数指针必须是普通...原创 2020-03-25 10:32:58 · 83 阅读 · 0 评论 -
剑指offer#44.数字序列中某一位的数字
数字序列中某一位的数字:数字以0123456789101112131415…的格式序列化到一个字符序列中。在这个序列中,第5位(从下标0开始计数)是5,第13位是1,第19位是4,等等。请写一个函数,求任意第n位对应的数字。来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/shu-zi-xu-lie-zhong-mou-yi-wei-de-...原创 2020-03-24 14:07:37 · 125 阅读 · 0 评论 -
剑指offer#43.整数中1出现的个数
题目描述:求出113的整数中1出现的次数,并算出1001300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1、10、11、12、13因此共出现6次,但是对于后面问题他就没辙了。ACMer希望你们帮帮他,并把问题更加普遍化,可以很快的求出任意非负整数区间中1出现的次数(从1 到 n 中1出现的次数)。思路:获取每个位为1时,有多少个数,全部加起来假如数为32410,我们用i...原创 2020-03-23 15:42:03 · 63 阅读 · 0 评论 -
剑指offer#42.连续子数组的最大和
题目描述:HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学。今天测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决。但是,如果向量中包含负数,是否应该包含某个负数,并期望旁边的正数会弥补它呢?例如:{6,-3,-2,7,-15,1,2,2},连续子向量的最大和为8(从第0个开始,到第3个为止)。给一个数组,返回它的最大连续子序列...原创 2020-03-23 14:08:47 · 85 阅读 · 0 评论 -
剑指offer#41.数据流中的中位数
[题目描述如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。我们使用Insert()方法读取数据流,使用GetMedian()方法获取当前读取数据的中位数。](https://www.nowcoder.com/practice/9be0172896bd43948...原创 2020-03-22 13:05:06 · 56 阅读 · 0 评论 -
剑指offer#40.最小的k个数
[题目描述输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。](https://www.nowcoder.com/practice/6a296eb82cf844ca8539b57c23e6e9bf?tpId=13&tqId=11182&tPage=1&rp=1&ru=/ta/coding-in...原创 2020-03-22 11:25:38 · 59 阅读 · 0 评论 -
剑指offer#39.数组中次数超过一般的数字
[题目描述数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。](https://www.nowcoder.com/questionTerminal/e8a1b01a2df14cb2b228b30ee6a92163?f=discussion...原创 2020-03-18 15:16:04 · 68 阅读 · 0 评论 -
剑指offer#38.字符串的排列
题目描述:输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。输入描述:输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母。注意这里要求字典序排列,最后要进行一次排序操作递归,每个位置可以换或者不换,不换就是与其本身进行交换,换就是与其后面的字符进行交...原创 2020-03-17 13:40:34 · 99 阅读 · 0 评论 -
剑指offer#37.序列化二叉树
请实现两个函数,分别用来序列化和反序列化二叉树二叉树的序列化是指:把一棵二叉树按照某种遍历方式的结果以某种格式保存为字符串,从而使得内存中建立起来的二叉树可以持久保存。序列化可以基于先序、中序、后序、层序的二叉树遍历方式来进行修改,序列化的结果是一个字符串,序列化时通过 某种符号表示空节点(#),以 ! 表示一个结点值的结束(value!)。二叉树的反序列化是指:根据某种遍历顺序得到的序列化字...原创 2020-03-16 12:23:13 · 62 阅读 · 0 评论 -
剑指offer#36.二叉搜索树和双向链表
二叉搜索树和双向链表:输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。思路:因为是二叉搜索树,所以有左小右大,中序遍历有序的特性。因此要利用其中序遍历有序的特性,来进行转换。那么如果采用中序遍历,遍历到某个节点,要处理它的时候,就说明它的左子树已经处理好了,那么就可以修改它的左孩子指针,但是其右子树还没有遍历,所以还不可以修改它...原创 2020-03-15 14:00:38 · 95 阅读 · 0 评论 -
剑指offer#35.复杂链表的复制
复杂链表的复制:输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)解法一:使用hashmap来存储每个节点对应复制出来的节点,可以靠此利用O(n)的空间换得O(n)的时间RandomListNode* Clone(RandomLis...原创 2019-11-11 10:36:55 · 70 阅读 · 0 评论 -
剑指offer#34.二叉树中和为某一值的路径
二叉树中和为某一值的路径:输入一颗二叉树的跟节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。(注意: 在返回值的list中,数组长度大的数组靠前)/*struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; Tree...原创 2019-11-10 15:16:02 · 72 阅读 · 0 评论 -
剑指offer#33.二叉搜索树的后序遍历序列
二叉搜索树的后序遍历序列:输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。class Solution {public: bool VerifySquenceOfBST(vector<int> sequence) { /* 二叉搜索树,遵循左小右大的特性...原创 2019-11-09 15:12:08 · 59 阅读 · 0 评论 -
剑指offer#32_2.把二叉树打印成多行 && 32_3.按之字形顺序打印二叉树
把二叉树打印成多行:从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。分析:首先要对其进行层次遍历,在层次遍历过程中,逐行打印,因此要统计出每行的节点数。我们在遍历过程中,到了新的行,取出队列中的结点数就是当前本层的结点个数。或者也可以利用变量来统计,需要两个变量,一个统计尚未打印的结点数,一个统计下一层的结点数,当我们在将左右子树入队的判断就可以对下一层节点数变量进行累加,等到...原创 2019-11-08 16:43:11 · 105 阅读 · 0 评论 -
剑指offer#32从上到下打印二叉树
从上到下打印二叉树:从上往下打印出二叉树的每个节点,同层节点从左至右打印。#include<deque>/*struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) { }}...原创 2019-11-08 15:45:47 · 78 阅读 · 0 评论 -
剑指offer#31.栈的压入、弹出序列
栈的压入弹出序列:输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)#include<stack>class Solution {...原创 2019-11-08 15:30:57 · 55 阅读 · 0 评论 -
剑指offer#30.包含min函数的栈
包含min函数的栈:定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1))。#include<stack>class Solution { /** 思路:使用两个栈,一个用来存储元素,一个用来存储最小值 当压入一个元素时,如果该元素比辅助栈的栈顶元素小,则压入辅助栈 如果比辅助栈的栈顶元素...原创 2019-11-08 15:30:48 · 56 阅读 · 0 评论 -
剑指offer#29.顺时针打印矩阵
顺时针打印矩阵:输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下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.分析:每次打印一圈,用start来确定起始打印的点,从0开始,每次增加1,中点是最后打印的一个点,因此循环条件是...原创 2019-11-07 18:39:14 · 86 阅读 · 0 评论 -
剑指offer#28.对称的二叉树
对称的二叉树:请实现一个函数,用来判断一颗二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。分析:对称的二叉树,首先判断该树是否是空树或者是只有一个节点的树,然后从根节点的左右子树开始进行遍历操作,通过左树的左子树和右树的右子树,左树的右子树和右树的左子树的值是否一样来判断是否对称,如果值不同,肯定不是,如果一颗子树是空另一颗不是,那也肯定不是,如果遍历到两颗子树...原创 2019-11-07 16:09:10 · 72 阅读 · 0 评论 -
剑指offer#27.二叉树的镜像
二叉树的镜像:操作给定的二叉树,将其变换为源二叉树的镜像。分析:其实就是遍历二叉树,然后交换其左右子树/*struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) { }};*/cla...原创 2019-11-07 14:38:12 · 67 阅读 · 0 评论 -
剑指offer#26.树的子结构
树的子结构:输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)解法:bool HasSubtree(TreeNode* pRoot1, TreeNode* pRoot2) { /* 思路:首先搜索左树的树节点值和右树根节点的值相同的节点,相同就可以开启判断 判断的过程是,左树的子树和右树一起进行每个...原创 2019-11-06 13:09:35 · 83 阅读 · 0 评论 -
剑指offer#25.合并两个排序的链表
合并两个排序的链表:输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。解法一:不用递归,比较大小然后加入新的链表即可ListNode* Merge(ListNode* pHead1, ListNode* pHead2) { /*思路:不用递归*/ ListNode *newHead = (Li...原创 2019-11-06 12:41:28 · 74 阅读 · 0 评论 -
剑指offer#22.链表中倒数第k个节点 && LeetCode#876.链表的中间节点 && 剑指offer#23.链表中环的入口结点 &&剑指offer#24.反转链表
链表中倒数第k个节点:输入一个链表,输出该链表中倒数第k个结点。解法一:使用两次遍历,第一次遍历整张链表得到链表长度n,然后第二次遍历链表查找第n-k+1个节点解法二:使用两个指针,前指针先向前走k-1步,之后前后指针一起走,等到前指针走到链尾,后指针也就指向倒数第k个节点。ListNode* FindKthToTail(ListNode* pListHead, unsigned int...原创 2019-11-03 10:18:13 · 166 阅读 · 0 评论 -
剑指offer#21.调整数组顺序使技术位于偶数之前
调整奇数位于偶数之前:输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位与偶数的前半部分,偶数位于数组的后半部分,不需要保持相对位置。//// Created by 郑卓铭 on 2019/10/31.//#include<iostream>#include<vector>using namespace std;class Solutio...原创 2019-11-01 13:40:20 · 113 阅读 · 0 评论 -
剑指offer#20.表示数值的字符串
表示数值的字符串:请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100",“5e2”,"-123",“3.1416"和”-1E-16"都表示数值。 但是"12e",“1a3.14”,“1.2.3”,"±5"和"12e+4.3"都不是。class Solution {public: bool scanUnsignedInteger(char** str){...原创 2019-10-30 21:25:29 · 253 阅读 · 1 评论 -
剑指offer#19.正则表达式匹配
正则表达式匹配:请实现一个函数用来匹配包括’.‘和’‘的正则表达式。模式中的字符’.‘表示任意一个字符,而’'表示它前面的字符可以出现任意次(包含0次)。 在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"abaca"匹配,但是与"aa.a"和"ab*a"均不匹配分析:对str和pattern匹配的过程中,每次匹配一个字符,但是会出现下一个字符是号的情况。...原创 2019-10-29 10:35:30 · 74 阅读 · 0 评论 -
剑指offer#18.删除链表的节点 && 18_2删除链表中重复的节点
删除链表的节点 :给定单向链表的头指针和一个节点指针,定义一个函数在O(1)时间内删除该节点。分析:因为题目直接给定了要被删除的节点,因此如果想在O(1)时间内删除给定节点,我们可以把要被删除的下一节点覆盖本节点,然后删除下一个节点即可,但有两种特殊情况,首先是当整个链表只有这么一个节点的时候,那就只把把链赋值成nullptr,其次是如果该节点是链表的最后一个节点,但是链表不是只只有一个节点,这...原创 2019-10-28 13:11:55 · 92 阅读 · 0 评论 -
剑指offer#17.打印从1道最大的n位数
打印从1到最大的n位数:输入数字n,按顺序打印出从1到最大的n位十进制数,比如输入3,打印出1,2,3…,999。解法一:使用大数累加法分析:利用一个char数组来模拟数字,对于累加过程是在最低位自加1,然后其他位判断是否需要进位,溢出判断利用在进位的时候判断当前位是否是最高位0位,如果是就是溢出,此时就中断累加返回了,打印函数要从高位的第一个非0开始打印,因此要设置bool变量来标志是否可以...原创 2019-10-25 18:32:27 · 86 阅读 · 0 评论 -
剑指offer#16.数值的整数次方
数值的整数次方:给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。保证base和exponent不同时为0解法一:使用循环来求分析:注意考虑特殊情况,当底数为0,如果指数是正整数,则可以返回1,如果底数为0,指数是负整数,那么就会出错,而且如果底数不是0,指数是负整数,则返回的应该是底数和正整数运算结果的倒数。因此要考虑齐全。do...转载 2019-10-24 19:46:11 · 74 阅读 · 0 评论