剑指offer
NCY_92377
Far from being a good programmer
展开
-
剑指 Offer 27. 二叉树的镜像
剑指 Offer 27. 二叉树的镜像请完成一个函数,输入一个二叉树,该函数输出它的镜像。例如输入: 4 / \ 2 7 / \ / \1 3 6 9镜像输出: 4 / \ 7 2 / \ / \9 6 3 1示例 1:输入:root = [4,2,7,1,3,6,9]输出:[4,7,2,9,6,3,1]限制:0 <= 节点个数 <= 1000解题思路dfs 交换roo原创 2020-08-05 22:06:13 · 117 阅读 · 0 评论 -
剑指 Offer 55 - I. 二叉树的深度
剑指 Offer 55 - I. 二叉树的深度输入一棵二叉树的根节点,求该树的深度。从根节点到叶节点依次经过的节点(含根、叶节点)形成树的一条路径,最长路径的长度为树的深度。例如:给定二叉树 [3,9,20,null,null,15,7], 3 / \ 9 20 / \ 15 7返回它的最大深度 3 。解题思路一、 DFS/递归(后序遍历)解1/** * Definition for a binary tree node. * str原创 2020-08-05 21:26:20 · 123 阅读 · 0 评论 -
剑指 Offer 24. 反转链表
题目描述定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。示例:输入: 1->2->3->4->5->NULL输出: 5->4->3->2->1->NULL限制:0 <= 节点个数 <= 5000code利用数组/** * Definition for singly-linked list. * struct ListNode { * int val; * List原创 2020-07-29 23:10:57 · 103 阅读 · 0 评论 -
剑指 Offer 25. 合并两个排序的链表
题目描述输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是递增排序的。示例1:输入:1->2->4, 1->3->4输出:1->1->2->3->4->4限制:0 <= 链表长度 <= 1000code迭代写法/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *nex原创 2020-07-26 02:30:31 · 77 阅读 · 0 评论 -
剑指 Offer 58 - II. 左旋转字符串
题目描述字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。比如,输入字符串"abcdefg"和数字2,该函数将返回左旋转两位得到的结果"cdefgab"。示例 1:输入: s = "abcdefg", k = 2输出: "cdefgab"示例 2:输入: s = "lrloseumgh", k = 6输出: "umghlrlose"限制:1 <= k < s.length <= 10000code复习一下原创 2020-07-22 23:10:47 · 95 阅读 · 0 评论 -
剑指 Offer 42. 连续子数组的最大和
题目描述输入一个整型数组,数组里有正数也有负数。数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。要求时间复杂度为O(n)。示例1:输入: nums = [-2,1,-3,4,-1,2,1,-5,4]输出: 6解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。提示:1 <= arr.length <= 10^5-100 <= arr[i] <= 100code动态规划class Solution {public:原创 2020-07-19 03:13:37 · 71 阅读 · 0 评论 -
剑指 Offer 53 - I. 在排序数组中查找数字 I
题目描述统计一个数字在排序数组中出现的次数。示例 1:输入: nums = [5,7,7,8,8,10], target = 8输出: 2示例 2:输入: nums = [5,7,7,8,8,10], target = 6输出: 0限制:0 <= 数组长度 <= 50000code顺序查找20msclass Solution {public: int search(vector<int>& nums, int target) {原创 2020-07-18 21:52:22 · 181 阅读 · 0 评论 -
剑指offer-旋转数组的最小值II
题目描述假设按照升序排序的数组在预先未知的某个点上进行了旋转。( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] )。请找出其中最小的元素。注意数组中可能存在重复的元素。示例 1:输入: [1,3,5]输出: 1示例 2:输入: [2,2,2,0,1]输出: 0code二分法同:剑指offer-旋转数组的最小值Iclass Solution {public: int findMin(vector<int>&原创 2020-07-18 21:07:35 · 101 阅读 · 0 评论 -
剑指offer-旋转数组的最小值
题目描述把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。例如,数组 [3,4,5,1,2] 为 [1,2,3,4,5] 的一个旋转,该数组的最小值为1。示例 1:输入:[3,4,5,1,2]输出:1示例 2:输入:[2,2,2,0,1]输出:0code顺序查找:8msclass Solution {public: int minArray(vector<int>& numbe原创 2020-07-18 20:58:42 · 91 阅读 · 0 评论 -
剑指 Offer~n-1中缺失的数字
题目描述一个长度为n-1的递增排序数组中的所有数字都是唯一的,并且每个数字都在范围0~n-1之内。在范围0~n-1内的n个数字中有且只有一个数字不在该数组中,请找出这个数字。示例 1:输入: [0,1,3]输出: 2示例 2:输入: [0,1,2,3,4,5,6,7,9]输出: 8限制:1 <= 数组长度 <= 10000code已知当缺少某一个值时,该值前面的位置都是正确的,即nums[i]==i,则只需找到满足nums[i]!=i的第一个位置即可顺序查找:40m原创 2020-07-18 06:27:49 · 192 阅读 · 0 评论 -
剑指offer-变态跳台阶
题目描述一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。code找规律得:f(n)=f(n-1)+f(n-2)+…+f(1)+1class Solution {public: int f[50]={0};//注意初始化 int jumpFloorII(int number) { //f(n)=f(n-1)+f(n-2)+...+f(1)+1 f[1]=1; f[2]=2原创 2020-07-17 23:16:58 · 71 阅读 · 0 评论 -
剑指offer-斐波那契数列
题目描述大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0,第1项是1)。n<=39code斐波那契同类题:矩形覆盖跳台阶class Solution {public: int f[40]; int Fibonacci(int number) { f[0]=0; f[1]=1; for(int i=2;i<=number;i++) f原创 2020-07-17 22:57:58 · 75 阅读 · 0 评论 -
剑指offer-跳台阶
题目描述一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。code递归形式为斐波那契,同矩形覆盖class Solution {public: int f[1000]; int jumpFloor(int number) { f[1]=1; f[2]=2; for(int i=3;i<=number;i++) f[i]=f[i-1]+原创 2020-07-17 22:53:54 · 68 阅读 · 0 评论 -
剑指offer-矩形覆盖
题目描述我们可以用21的小矩形横着或者竖着去覆盖更大的矩形。请问用n个21的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?比如n=3时,2*3的矩形块有3种覆盖方法:code强推几个发现递归形式为斐波那契注意直接用递归栈会超内存,使用递推class Solution {public: int f[1000]; int rectCover(int number) { //f(n)=f(n-1)+f(n-2) f[1]=1;原创 2020-07-17 22:48:46 · 71 阅读 · 0 评论 -
剑指offer-把字符串转换成整数
题目描述将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数。 数值为0或者字符串不是一个合法的数值则返回0输入描述:输入一个字符串,包括数字字母符号,可以为空输出描述:如果是合法的数值表达则返回该数字,否则返回0输入:+21474836471a33输出:21474836470code这题判断合法数字直接借用了上一题(表示数值的字符串),实际上远没有这么复杂哈数据没有我想的复杂,并没有溢出,也没有e/E应该是可以在判断完符号之后直接用atoi()函数的cla原创 2020-07-17 00:55:40 · 98 阅读 · 0 评论 -
剑指offer-表示数值的字符串
题目描述请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100",“5e2”,"-123",“3.1416"和”-1E-16"都表示数值。 但是"12e",“1a3.14”,“1.2.3”,"±5"和"12e+4.3"都不是。code合法的种类太多,因此从判断不合法入手找规律,提炼要求:只能存在+/-/e/E/./数字,存在其他字母则不是数字小数点只能有一个+/-号只能存在于第一个位置或者e/E后边,+/-号后边只能跟数字或者小数点(或者说不能为空也不能是其他字原创 2020-07-17 00:08:38 · 65 阅读 · 0 评论 -
剑指offer-替换空格
题目描述请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。codeclass Solution {public: void replaceSpace(char *str,int length) { //先计算修改后的字符串长度 int space=0; char* p1=str; while(*p1!='\0'){ if(*p1原创 2020-07-16 23:17:26 · 94 阅读 · 0 评论 -
左旋转字符串
题目描述汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果。对于一个给定的字符序列S,请你把其循环左移K位后的序列输出。例如,字符序列S=”abcXYZdef”,要求输出循环左移3位后的结果,即“XYZdefabc”。是不是很简单?OK,搞定它!codeclass Solution {public: string LeftRotateString(string str, int n) { if(str=="")//字符串为空原创 2020-07-16 19:14:50 · 78 阅读 · 0 评论 -
第一个只出现一次的字符
题目描述在一个字符串(0<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置, 如果没有则返回 -1(需要区分大小写).(从0开始计数)code先确定所有元素的出现次数按输入顺序查找第一个仅出现一次的字母class Solution {public: map<char,int> mp; int FirstNotRepeatingChar(string str) { for(int i=0;i<原创 2020-07-16 18:45:25 · 96 阅读 · 0 评论 -
剑指offer-字符流中第一个不重复的字符
题目描述请实现一个函数用来找出字符流中第一个只出现一次的字符。例如,当从字符流中只读出前两个字符"go"时,第一个只出现一次的字符是"g"。当从该字符流中读出前六个字符“google"时,第一个只出现一次的字符是"l"。输出描述:如果当前字符流没有存在出现一次的字符,返回#字符。codeAC代码使用了map和vector使用了vector查找函数find和删除函数erase(利用迭代器)class Solution{public: map<char,int> mp原创 2020-07-16 18:27:37 · 68 阅读 · 0 评论 -
剑指offer-字符串的排列
题目描述输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。输入描述:输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母。code使用C++全排列next_permutation//ACclass Solution {public: vector<string> Permutation(string str) { //原创 2020-07-16 17:28:37 · 65 阅读 · 0 评论 -
剑指offer-把字符串转换成整数
题目类型字符串题目描述将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数。 数值为0或者字符串不是一个合法的数值则返回0输入描述:输入一个字符串,包括数字字母符号,可以为空输出描述:如果是合法的数值表达则返回该数字,否则返回0输入+2147483647 1a33输出2147483647 0code%23 Code未知错误class ...原创 2020-03-18 06:25:44 · 75 阅读 · 0 评论 -
剑指offer-最小的k个数
题目类型数组 高级算法题目描述输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。codeclass Solution {public: vector<int> GetLeastNumbers_Solution(vector<int> input, int k) { i...原创 2020-03-18 05:08:24 · 80 阅读 · 0 评论 -
剑指offer-数组中出现次数超过一半的数字
题目类型数组题目描述数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。code用c++ count函数统计次数class Solution {public: int MoreThanHalfNum_Solution...原创 2020-03-18 04:57:36 · 97 阅读 · 0 评论 -
剑指offer-字符串的排列
题目类型字符串 动态规划 递归题目描述输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。输入描述:输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母。code善用C++全排列函数:next_permutation(num,num+n) 按...原创 2020-03-18 02:38:18 · 87 阅读 · 0 评论 -
剑指offer-求1+2+3+...+n
题目类型进制转化题目描述求1+2+3+…+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。code数学公式class Solution {public: int Sum_Solution(int n) { return (1+n)*n/2; }};运行时间:3ms占用内...原创 2020-03-18 01:28:52 · 117 阅读 · 0 评论 -
剑指offer-栈的压入、弹出序列
题目类型栈题目描述输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)code借用栈模拟class Solution {public...原创 2020-03-18 00:33:39 · 73 阅读 · 0 评论 -
包含min函数的栈
题目类型栈题目描述定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1))。注意:保证测试中不会当栈为空的时候,对栈调用pop()或者min()或者top()方法。codecode0一个栈+一个同步容器这里要注意vector的erase操作class Solution {public: stack<int> s...原创 2020-03-12 00:26:53 · 86 阅读 · 0 评论 -
剑指offer-调整数组顺序使奇数位于偶数前面
题目类型数组题目描述输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变codeclass Solution {public: void reOrderArray(vector<int> &array) { vector<i...原创 2020-03-11 23:57:34 · 67 阅读 · 0 评论 -
剑指offer-变态跳台阶
题目类型贪心 递归题目描述一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法codeclass Solution {public: int jumpFloorII(int number) { if(number==1) return 1; else return 2...原创 2020-03-07 01:52:07 · 86 阅读 · 0 评论 -
剑指offer-跳台阶
题目类型递归题目描述一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。codeclass Solution {public: int jumpFloor(int number) { if(number==1) return 1; else if(number==2) return...原创 2020-03-07 01:34:24 · 126 阅读 · 0 评论 -
剑指offer-斐波那契数列
题目类型递归题目描述大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0)。n<=39codeclass Solution {public: int Fibonacci(int n) { if(n==0) return 0; else if(n==1||n==2) ...原创 2020-03-07 01:23:00 · 72 阅读 · 0 评论 -
剑指offer-旋转数组的最小数字
题目类型查找题目描述把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。codeclass Solution {public: int minNumber...原创 2020-03-07 01:14:33 · 77 阅读 · 0 评论 -
剑指offer-用两个栈实现队列
题目类型队列 栈题目描述用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。codeclass Solution{public: void push(int node) { stack1.push(node); } int pop(){ int e; while(!stack1....原创 2020-03-07 01:03:05 · 118 阅读 · 0 评论 -
剑指offer-从尾到头打印链表
题目类型链表题目描述输入一个链表,按链表从尾到头的顺序返回一个ArrayList。code/*** struct ListNode {* int val;* struct ListNode *next;* ListNode(int x) :* val(x), next(NULL) {* }*...原创 2020-03-07 00:02:54 · 78 阅读 · 0 评论 -
剑指offer-二维树组中的查找
题目分类数组 查找题目描述在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数codeclass Solution {public: bool Find(int target, vector<vector<int> >...原创 2020-03-06 22:55:26 · 68 阅读 · 0 评论