剑指offer
董洞洞同学
这个作者很懒,什么都没留下…
展开
-
树中两个结点的最低公共祖先
给出一个二叉树,输入两个树节点,求它们的最低公共祖先。一个树节点的祖先节点包括它本身。注意:输入的二叉树不为空;输入的两个节点一定不为空,且是二叉树中的节点;样例二叉树[8, 12, 2, null, null, 6, 4, null, null, null, null]如下图所示: 8 / \ 12 2 / \ 6 4如果输入的树节点...原创 2020-01-15 15:09:21 · 220 阅读 · 0 评论 -
把字符串转换成整数
请你写一个函数StrToInt,实现把字符串转换成整数这个功能。当然,不能使用atoi或者其他类似的库函数。样例输入:“123”输出:123注意:你的函数应满足下列条件:忽略所有行首空格,找到第一个非空格字符,可以是 ‘+/−’ 表示是正数或者负数,紧随其后找到最长的一串连续数字,将其解析成一个整数;整数后可能有任意非数字字符,请将其忽略;如果整数长度为0,则返回0;如果整数大...原创 2020-01-15 11:02:16 · 174 阅读 · 0 评论 -
股票的最大利润
假设把某股票的价格按照时间先后顺序存储在数组中,请问买卖 一次 该股票可能获得的利润是多少?例如一只股票在某些时间节点的价格为[9, 11, 8, 5, 7, 12, 16, 14]。如果我们能在价格为5的时候买入并在价格为16时卖出,则能收获最大的利润11。样例输入:[9, 11, 8, 5, 7, 12, 16, 14]输出:11class Solution {public: ...原创 2020-01-15 09:51:48 · 95 阅读 · 0 评论 -
构建乘积数组
给定一个数组A[0, 1, …, n-1],请构建一个数组B[0, 1, …, n-1],其中B中的元素B[i]=A[0]×A[1]×… ×A[i-1]×A[i+1]×…×A[n-1]。不能使用除法。样例输入:[1, 2, 3, 4, 5]输出:[120, 60, 40, 30, 24]思考题:能不能只使用常数空间?(除了输出的数组之外)class Solution {public...原创 2020-01-14 17:00:35 · 82 阅读 · 0 评论 -
不用加减乘除做加法
写一个函数,求两个整数之和,要求在函数体内不得使用+、-、×、÷ 四则运算符号。样例输入:num1 = 1 , num2 = 2输出:3class Solution {public: int add(int num1, int num2){ while(num2){ int sum = num1 ^ num2; ...原创 2020-01-14 14:54:32 · 81 阅读 · 0 评论 -
扑克牌的顺子
从扑克牌中随机抽5张牌,判断是不是一个顺子,即这5张牌是不是连续的。2~10为数字本身,A为1,J为11,Q为12,K为13,大小王可以看做任意数字。为了方便,大小王均以0来表示,并且假设这副牌中大小王均有两张。样例1输入:[8,9,10,11,12]输出:true样例2输入:[0,8,9,11,12]输出:trueclass Solution {public: boo...原创 2020-01-14 11:09:00 · 150 阅读 · 0 评论 -
滑动窗口的最大值
给定一个数组和滑动窗口的大小,请找出所有滑动窗口里的最大值。例如,如果输入数组[2, 3, 4, 2, 6, 2, 5, 1]及滑动窗口的大小3,那么一共存在6个滑动窗口,它们的最大值分别为[4, 4, 6, 6, 6, 5]。注意:数据保证k大于0,且k小于等于数组长度。样例输入:[2, 3, 4, 2, 6, 2, 5, 1] , k=3输出: [4, 4, 6, 6, 6, 5]...原创 2020-01-13 23:16:01 · 87 阅读 · 0 评论 -
骰子的点数
将一个骰子投掷n次,获得的总点数为s,s的可能范围为n~6n。掷出某一点数,可能有多种掷法,例如投掷2次,掷出3点,共有[1,2],[2,1]两种掷法。请求出投掷n次,掷出n~6n点分别有多少种掷法。样例1输入:n=1输出:[1, 1, 1, 1, 1, 1]解释:投掷1次,可能出现的点数为1-6,共计6种。每种点数都只有1种掷法。所以输出[1, 1, 1, 1, 1, 1]。样例2...原创 2020-01-13 20:19:59 · 1630 阅读 · 0 评论 -
圆圈中最后剩下的数字
0, 1, …, n-1这n个数字(n>0)排成一个圆圈,从数字0开始每次从这个圆圈里删除第m个数字。求出这个圆圈里剩下的最后一个数字。样例输入:n=5 , m=3输出:3class Solution {public: int lastRemaining(int n, int m){ if(n == 1) return 0; return ...原创 2020-01-13 15:38:50 · 121 阅读 · 0 评论 -
翻转单词顺序
输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。为简单起见,标点符号和普通字母一样处理。例如输入字符串"I am a student.",则输出"student. a am I"。样例输入:“I am a student.”输出:“student. a am I”class Solution {public: string reverseWords(strin...原创 2020-01-11 14:29:44 · 285 阅读 · 0 评论 -
左旋转字符串
字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。比如输入字符串"abcdefg"和数字2,该函数将返回左旋转2位得到的结果"cdefgab"。注意:数据保证n小于等于输入字符串的长度。样例输入:“abcdefg” , n=2输出:“cdefgab”class Solution {public: string lef...原创 2020-01-11 11:01:36 · 100 阅读 · 0 评论 -
和为S的连续正数序列
输入一个正数s,打印出所有和为s的连续正数序列(至少含有两个数)。例如输入15,由于1+2+3+4+5=4+5+6=7+8=15,所以结果打印出3个连续序列1~5、4~6和7~8。样例输入:15输出:[[1,2,3,4,5],[4,5,6],[7,8]]class Solution {public: vector<vector<int> > findCo...原创 2020-01-11 10:13:52 · 85 阅读 · 0 评论 -
数组中唯一只出现一次的数字
在一个数组中除了一个数字只出现一次之外,其他数字都出现了三次。请找出那个只出现一次的数字。你可以假设满足条件的数字一定存在。思考题:如果要求只使用 O(n)O(n) 的时间和额外 O(1)O(1) 的空间,该怎么做呢?样例输入:[1,1,1,2,2,2,3,4,4,4]输出:3class Solution {public: int findNumberAppearingO...原创 2020-01-10 15:23:08 · 161 阅读 · 0 评论 -
和为S的两个数字
输入一个数组和一个数字s,在数组中查找两个数,使得它们的和正好是s。如果有多对数字的和等于s,输出任意一对即可。你可以认为每组输入中都至少含有一组满足条件的输出。样例输入:[1,2,3,4] , sum=7输出:[3,4]class Solution {public: vector<int> findNumbersWithSum(vector<int>...原创 2020-01-10 10:28:44 · 91 阅读 · 0 评论 -
求1+2+…+n
求1+2+…+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。样例输入:10输出:55class Solution {public: int getSum(int n) { int res = n; n > 0 && (res += getSum(n - ...原创 2020-01-09 15:09:14 · 72 阅读 · 0 评论 -
数组中只出现一次的两个数字
一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。你可以假设这两个数字一定存在。样例输入:[1,2,3,3,4,4]输出:[1,2]class Solution {public: vector<int> findNumsAppearOnce(vector<int>& nums) { in...原创 2020-01-09 14:56:21 · 85 阅读 · 0 评论 -
平衡二叉树
输入一棵二叉树的根结点,判断该树是不是平衡二叉树。如果某二叉树中任意结点的左右子树的深度相差不超过1,那么它就是一棵平衡二叉树。注意:规定空树也是一棵平衡二叉树。样例输入:二叉树[5,7,11,null,null,12,9,null,null,null,null]如下所示, 5 / \ 7 11 / \ 12 9输出:true/** * ...原创 2020-01-09 10:34:32 · 110 阅读 · 0 评论 -
二叉树的深度
输入一棵二叉树的根结点,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。输入:二叉树[8, 12, 2, null, null, 6, 4, null, null, null, null]如下图所示: 8 / \ 12 2 / \ 6 4输出:3/** * Definition for ...原创 2020-01-08 13:48:56 · 61 阅读 · 0 评论 -
二叉搜索树的第k个结点
给定一棵二叉搜索树,请找出其中的第k小的结点。你可以假设树和k都存在,并且1≤k≤树的总结点数。样例输入:root = [2, 1, 3, null, null, null, null] ,k = 3 2 / \ 1 3输出:3二叉搜索树的中序遍历是单调递增的数列/** * Definition for a binary tree node. * struc...原创 2020-01-08 10:53:32 · 73 阅读 · 0 评论 -
数组中的逆序对
在数组中的两个数字如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。样例输入:[1,2,3,4,5,6,0]输出:61.算法O(n2)O(n^2)O(n2)class Solution {public: int inversePairs(vector<int>& nums) { int ...原创 2020-01-07 14:47:26 · 83 阅读 · 0 评论 -
数组中数值和下标相等的元素
假设一个单调递增的数组里的每个元素都是整数并且是唯一的。请编程实现一个函数找出数组中任意一个数值等于其下标的元素。例如,在数组[-3, -1, 1, 3, 5]中,数字3和它的下标相等。样例输入:[-3, -1, 1, 3, 5]输出:3注意:如果不存在,则返回-1。class Solution {public: int getNumberSameAsIndex(vecto...原创 2020-01-07 09:16:56 · 186 阅读 · 0 评论 -
数字在排序数组中出现的次数
统计一个数字在排序数组中出现的次数。例如输入排序数组[1, 2, 3, 3, 3, 3, 4, 5]和数字3,由于3在这个数组中出现了4次,因此输出4。样例输入:[1, 2, 3, 3, 3, 3, 4, 5] , 3输出:4class Solution {public: int getNumberOfK(vector<int>& nums , int k...原创 2020-01-06 14:53:39 · 84 阅读 · 0 评论 -
0到n-1中缺失的数字
一个长度为n-1的递增排序数组中的所有数字都是唯一的,并且每个数字都在范围0到n-1之内。在范围0到n-1的n个数字中有且只有一个数字不在该数组中,请找出这个数字。样例输入:[0,1,2,4]输出:3class Solution {public: int getMissingNumber(vector<int>& nums) { if(num...原创 2020-01-06 10:03:36 · 172 阅读 · 0 评论 -
两个链表的第一个公共结点
输入两个链表,找出它们的第一个公共结点。当不存在公共节点时,返回空节点。样例给出两个链表如下所示:A: a1 → a2↘c1 → c2 → c3↗B: b1 → b2 → b3输出第一个公共节点c1/** * Definition for singly-linked list. * struct ListNode { * int val; ...原创 2020-01-04 10:30:09 · 77 阅读 · 0 评论 -
字符流中第一个只出现一次的字符
请实现一个函数用来找出字符流中第一个只出现一次的字符。例如,当从字符流中只读出前两个字符”go”时,第一个只出现一次的字符是’g’。当从该字符流中读出前六个字符”google”时,第一个只出现一次的字符是’l’。如果当前字符流没有存在出现一次的字符,返回#字符。样例输入:“google”输出:“ggg#ll”解释:每当字符流读入一个字符,就进行一次判断并输出当前的第一个只出现一次的字...原创 2020-01-03 11:02:52 · 138 阅读 · 0 评论 -
字符串中第一个只出现一次的字符
在字符串中找出第一个只出现一次的字符。如输入"abaccdeff",则输出b。如果字符串中不存在只出现一次的字符,返回#字符。样例:输入:“abaccdeff”输出:‘b’class Solution {public: char firstNotRepeatingChar(string s) { unordered_map<char, int> c...原创 2020-01-02 15:20:58 · 108 阅读 · 0 评论 -
丑数
我们把只包含质因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含质因子7。求第n个丑数的值。样例输入:5输出:5注意:习惯上我们把1当做第一个丑数。class Solution {public: int getUglyNumber(int n) { vector<int> q(1, 1); ...原创 2020-01-02 11:13:49 · 228 阅读 · 0 评论 -
最长不含重复字符的子字符串
请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。假设字符串中只包含从’a’到’z’的字符。样例输入:“abcabc”输出:3class Solution {public: int longestSubstringWithoutDuplication(string s) { unordered_map<char, int>...原创 2020-01-02 10:11:11 · 93 阅读 · 0 评论 -
礼物的最大价值
在一个m×n的棋盘的每一格都放有一个礼物,每个礼物都有一定的价值(价值大于0)。你可以从棋盘的左上角开始拿格子里的礼物,并每次向右或者向下移动一格直到到达棋盘的右下角。给定一个棋盘及其上面的礼物,请计算你最多能拿到多少价值的礼物?注意:m,n>0m,n>0样例:输入:[[2,3,1],[1,7,1],[4,6,1]]输出:19解释:沿着路径 2→3→7→6→1...原创 2020-01-01 22:41:20 · 65 阅读 · 0 评论 -
把数字翻译成字符串
给定一个数字,我们按照如下规则把它翻译为字符串:0翻译成”a”,1翻译成”b”,……,11翻译成”l”,……,25翻译成”z”。一个数字可能有多个翻译。例如12258有5种不同的翻译,它们分别是”bccfi”、”bwfi”、”bczi”、”mcfi”和”mzi”。请编程实现一个函数用来计算一个数字有多少种不同的翻译方法。样例输入:“12258”输出:5class Solution {...原创 2019-12-31 17:05:34 · 106 阅读 · 0 评论 -
把数组排成最小的数
输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组[3, 32, 321],则打印出这3个数字能排成的最小数字321323。样例输入:[3, 32, 321]输出:321323注意:输出数字的格式为字符串。class Solution {public: static bool cmp(int a, int b){ ...原创 2019-12-31 10:08:40 · 58 阅读 · 0 评论 -
数字序列中某一位的数字
数字以0123456789101112131415…的格式序列化到一个字符序列中。在这个序列中,第5位(从0开始计数)是5,第13位是1,第19位是4,等等。请写一个函数求任意位对应的数字。样例输入:13输出:1class Solution {public: int digitAtIndex(int n) { long long i = 1, s = 9, b...原创 2019-12-30 20:05:58 · 58 阅读 · 0 评论 -
从1到n整数中1出现的次数
输入一个整数n,求从1到n这n个整数的十进制表示中1出现的次数。例如输入12,从1到12这些整数中包含“1”的数字有1,10,11和12,其中“1”一共出现了5次。样例输入: 12输出: 5解法1:log2(n)log^2(n)log2(n)class Solution {public: int numberOf1Between1AndN_Solution(int n) {...原创 2019-12-29 17:00:49 · 92 阅读 · 0 评论 -
连续子数组的最大和
输入一个 非空 整型数组,数组里的数可能为正,也可能为负。数组中一个或连续的多个整数组成一个子数组。求所有子数组的和的最大值。要求时间复杂度为O(n)。样例输入:[1, -2, 3, 10, -4, 7, 2, -5]输出:18class Solution {public: int maxSubArray(vector<int>& nums) { ...原创 2019-12-27 10:55:41 · 71 阅读 · 0 评论 -
数据流中的中位数
如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。样例输入:1, 2, 3, 4输出:1,1.5,2,2.5解释:每当数据流读入一个数据,就进行一次判断并输出当前的中位数。class Solution {public: priority_q...原创 2019-12-27 10:18:47 · 96 阅读 · 0 评论 -
最小的k个数
输入n个整数,找出其中最小的k个数。注意:数据保证k一定小于等于输入数组的长度;输出数组内元素请按从小到大顺序排序;样例输入:[1,2,3,4,5,6,7,8] , k=4输出:[1,2,3,4]class Solution {public: vector<int> getLeastNumbers_Solution(vector<int> input...原创 2019-12-26 19:08:26 · 57 阅读 · 0 评论 -
数组中出现次数超过一半的数字
数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。假设数组非空,并且一定存在满足条件的数字。思考题:假设要求只能使用 O(n)O(n) 的时间和额外 O(1)O(1) 的空间,该怎么做呢?样例输入:[1,2,1,1,3]输出:1class Solution {public: int moreThanHalfNum_Solution(vector<int&g...原创 2019-12-26 13:59:57 · 91 阅读 · 0 评论 -
数字排列
输入一组数字(可能包含重复数字),输出其所有的排列方式。输入:[1,2,3]输出: [ [1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], [3,2,1] ]class Solution {public: vector&l...原创 2019-12-24 23:01:04 · 312 阅读 · 0 评论 -
序列化二叉树
请实现两个函数,分别用来序列化和反序列化二叉树。您需要确保二叉树可以序列化为字符串,并且可以将此字符串反序列化为原始树结构。样例你可以序列化如下的二叉树 8 / \ 12 2 / \ 6 4为:"[8, 12, 2, null, null, 6, 4, null, null, null, null]"注意:以上的格式是AcWing序列化二叉...原创 2019-12-24 15:11:36 · 100 阅读 · 0 评论 -
二叉搜索树与双向链表
输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。注意:需要返回双向链表最左侧的节点。例如,输入下图中左边的二叉搜索树,则输出右边的排序双向链表。/** * Definition for a binary tree node. * struct TreeNode { * int val; * Tre...原创 2019-12-23 11:22:43 · 73 阅读 · 0 评论