剑指offer经典面试题集锦
newcode上的剑指offer题目专栏
刘小小小小刘
https://liuziqiao.github.io/
展开
-
【剑指offer】丑数
题目描述把只包含质因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含质因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。解决方案1.一一遍历:时间复杂度高一次遍历求出第index个丑数,从1开始,如果是丑数则count++,直到count = index为止。判断丑数依据题目意思,丑数只有2,3,5三个因子,因此就用这个...原创 2019-03-31 21:24:58 · 145 阅读 · 0 评论 -
【剑指offer】变态跳台阶
题目描述一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。解决方案class Solution {public: int jumpFloorII(int number) { if (number < 1) { return 0; } ...原创 2019-03-31 20:07:22 · 119 阅读 · 1 评论 -
【剑指offer】跳台阶
题目描述一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。解决方案class Solution {public: int jumpFloor(int number) { if (number == 1) { return 1; } int a = 1; int b = 1; int ...原创 2019-03-31 20:06:45 · 97 阅读 · 0 评论 -
【剑指offer】平衡二叉树
题目描述输入一棵二叉树,判断该二叉树是否是平衡二叉树。解决方案class Solution {public: bool IsBalanced_Solution(TreeNode* pRoot) { if(pRoot == NULL) return true; if(abs(getDepth(pRoot->left) - getDepth(pRo...原创 2019-03-30 00:43:00 · 94 阅读 · 0 评论 -
【剑指offer】第一次出现一次的字符
题目描述在一个字符串(0<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置, 如果没有则返回 -1(需要区分大小写).解决方案class Solution {public: int FirstNotRepeatingChar(string str) { int hashtable[256] = {0}; ...原创 2019-03-30 10:33:55 · 92 阅读 · 0 评论 -
字符流中第一个不重复的字符
题目描述请实现一个函数用来找出字符流中第一个只出现一次的字符。例如,当从字符流中只读出前两个字符"go"时,第一个只出现一次的字符是"g"。当从该字符流中读出前六个字符“google"时,第一个只出现一次的字符是"l"。输出描述:如果当前字符流没有存在出现一次的字符,返回#字符。解决方案class Solution{public: //Insert one char from ...原创 2019-03-29 23:16:21 · 114 阅读 · 0 评论 -
二进制中1的个数
题目描述输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。解决方案class Solution {public: int NumberOf1(int n) { int count = 0; while (n) { count++; n = n&(n-1); ...原创 2019-03-20 20:58:08 · 94 阅读 · 0 评论 -
二叉树中和为某一值的路径
题目描述输入一颗二叉树的跟节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。(注意: 在返回值的list中,数组长度大的数组靠前)解决方案/*struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNod...原创 2019-03-15 16:59:31 · 107 阅读 · 0 评论 -
数据流中的中位数
题目描述如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。我们使用Insert()方法读取数据流,使用GetMedian()方法获取当前读取数据的中位数。代码实现class Solution {public: priority_queue<i...原创 2019-03-12 23:17:00 · 119 阅读 · 0 评论 -
二叉搜索树的后序遍历序列
题目描述输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。解决方案class Solution {public: bool VerifyBST(vector<int> seq,int begin,int end){ if(seq.empty() || begin &g...原创 2019-02-27 21:18:03 · 197 阅读 · 0 评论 -
删除链表中重复的结点
题目描述在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5解决方案/*struct ListNode { int val; struct ListNode *next; ListNode(int x...原创 2019-02-21 22:12:19 · 94 阅读 · 0 评论 -
数组中出现次数超过一半的数字
题目描述数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。解决方案class Solution {public: int MoreThanHalfNum_Solution(vector<int> numbers) {...原创 2019-02-20 18:23:12 · 126 阅读 · 0 评论 -
包含min函数的栈
题目描述定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1))。解决方案class Solution {public: void push(int x) { s1.push(x); if(s2.empty() || x <= s2.top()) { ...原创 2019-02-20 18:21:28 · 97 阅读 · 0 评论 -
最小的K个数
题目描述输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。解决方案利用优先级队列很好的解决该问题,知道优先级队列的伙伴理解起来就非常简单啦。class Solution {public: vector<int> GetLeastNumbers_Solution(vector<int> inp...原创 2019-02-20 18:19:23 · 127 阅读 · 0 评论 -
二叉搜索树的第k个结点
题目描述:给定一棵二叉搜索树,请找出其中的第k小的结点。例如, (5,3,7,2,4,6,8) 中,按结点数值大小顺序第三小结点的值为4。/*struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : ...原创 2019-01-24 23:01:48 · 120 阅读 · 0 评论 -
滑动窗口的最大值
问题描述给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值。例如,如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3,那么一共存在6个滑动窗口,他们的最大值分别为{4,4,6,6,6,5};针对数组{2,3,4,2,6,2,5,1}的滑动窗口有以下6个:{[2,3,4],2,6,2,5,1},{2,[3,4,2],6,2,5,1},{2,3, [4,2,6],2,5,1...原创 2018-12-10 23:01:57 · 141 阅读 · 0 评论 -
旋转数组的最小数字
问题描述把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。解决方案咋眼一看这题,很简单啊,就一次遍历找到最小值就可以了啊,那答案就很简单。如下给出一般解决方案...原创 2018-12-08 13:38:01 · 148 阅读 · 0 评论 -
字符串替换
问题实现一个简单的字符串替换函数。原串中需要替换的占位符为"%s",请按照参数列表的顺序一一替换占位符。若参数列表的字符数大于占位符个数。则将剩下的参数字符添加到字符串的结尾。给定一个字符串A,同时给定它的长度n及参数字符数组arg,请返回替换后的字符串。保证参数个数大于等于占位符个数。保证原串由大小写英文字母组成,同时长度小于等于500。测试样例:"A%sC%sE",7,['B...原创 2018-12-02 20:14:08 · 403 阅读 · 0 评论 -
微信红包
问题春节期间小明使用微信收到很多个红包,非常开心。在查看领取红包记录时发现,某个红包金额出现的次数超过了红包总数的一半。请帮小明找到该红包金额。写出具体算法思路和代码实现,要求算法尽可能高效。给定一个红包的金额数组gifts及它的大小n,请返回所求红包的金额。若没有金额超过总数的一半,返回0。测试样例:[1,2,3,2,2],5返回:2解决方案方法一:C++中学过...原创 2018-12-02 20:08:46 · 300 阅读 · 0 评论 -
15.threeSum
问题Given an array nums of n integers, are there elements a, b, c in nums such that a + b + c = 0? Find all unique triplets in the array which gives the sum of zero.Note:The solution set must not ...原创 2018-09-27 07:56:22 · 327 阅读 · 0 评论 -
80.RemoveDuplicates II
问题Follow up for "Remove Duplicates": What if duplicates are allowed at most twice?For example, Given sorted array nums = [1,1,1,2,2,3],Your function should return length = 5, with the first fiv...原创 2018-09-18 16:57:38 · 291 阅读 · 0 评论 -
26.RemoveDuplicates I
问题Given a sorted array, remove the duplicates in place such that each element appear only once and return the new length.Do not allocate extra space for another array, you must do this in place w...原创 2018-09-18 16:57:06 · 255 阅读 · 0 评论 -
MySqrt
问题实现 int sqrt(int x) 函数。计算并返回 x 的平方根,其中 x 是非负整数。由于返回类型是整数,结果只保留整数的部分,小数部分将被舍去。示例 1:输入: 4输出: 2输入: 8输出: 2说明: 8 的平方根是 2.82842..., 由于返回类型是整数,小数部分将被舍去。解决方案通过二分法来确定取值区间int mySq...原创 2018-09-16 09:44:03 · 1708 阅读 · 0 评论 -
反转整数
问题给定一个 32 位有符号整数,将整数中的数字进行反转。示例 1:输入: 123输出: 321 示例 2:输入: -123输出: -321示例 3:输入: 120输出: 21注意:假设我们的环境只能存储 32 位有符号整数,其数值范围是 [−231, 231 − 1]。根据这个假设,如果反转后的整数溢出,则返回 0。解决Java解决方案安照正常...原创 2018-09-14 17:33:28 · 272 阅读 · 0 评论 -
最大获利
问题给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。如果你最多只允许完成一笔交易(即买入和卖出一支股票),设计一个算法来计算你所能获取的最大利润。注意你不能在买入股票前卖出股票。示例 1:输入: [7,1,5,3,6,4]输出: 5解释: 在第 2 天(股票价格 = 1)的时候买入,在第 5 天(股票价格 = 6)的时候卖出,最大利润 = 6-1 = 5 ...原创 2018-09-12 12:07:18 · 304 阅读 · 0 评论