![](https://img-blog.csdnimg.cn/20201014180756930.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
剑指offer
AI杰克王
AI杰克王,大厂算法经验,AI前沿从业。分享知识干货,探索可能性。
展开
-
链表中倒数第k个结点
题目描述输入一个链表,输出该链表中倒数第k个结点。代码:/*struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next(NULL) { }};*/class Solution {public: ListNode* FindKthToTail(ListNo...原创 2019-06-19 12:26:26 · 66 阅读 · 0 评论 -
左旋转字符串
汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果。对于一个给定的字符序列S,请你把其循环左移K位后的序列输出。例如,字符序列S=”abcXYZdef”,要求输出循环左移3位后的结果,即“XYZdefabc”。代码:思路1:先拼接,再使用内置函数类型取出循环左移后的结果class Solution {public: str...原创 2019-07-16 22:54:41 · 52 阅读 · 0 评论 -
字符串的排列
题目描述输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。输入描述:输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母。思路:递归法,问题转换为先固定第一个字符,求剩余字符的排列;求剩余字符排列时跟原问题一样。(1) 遍历出所有可能出现...原创 2019-07-21 18:38:22 · 87 阅读 · 0 评论 -
把数组排成最小的数
题目描述输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。思路和代码:/*对vector容器内的数据进行排序,按照 将a和b转为string后 若 a+b<b+a a排在在前 的规则排序, 如 2 21 因为 212 < 221 所以 排序后...原创 2019-07-22 01:03:28 · 72 阅读 · 0 评论 -
第一个只出现一次的字符
题目描述在一个字符串(0<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置, 如果没有则返回 -1(需要区分大小写).代码:class Solution {public: int FirstNotRepeatingChar(string str) { int len =str.size(); ...原创 2019-07-22 01:44:36 · 76 阅读 · 0 评论 -
数组中只出现一次的数字
题目描述一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。思路:首先:位运算中异或的性质:两个相同数字异或=0,一个数和0异或还是它本身。当只有一个数出现一次时,我们把数组中所有的数,依次异或运算,最后剩下的就是落单的数,因为成对儿出现的都抵消了。依照这个思路,我们来看两个数(我们假设是AB)出现一次的数组。我们首先还是先异或,剩下的数...原创 2019-08-05 00:39:07 · 93 阅读 · 0 评论 -
和为S的连续正数序列
小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100。但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数)。没多久,他就得到另一组连续正数和为100的序列:18,19,20,21,22。现在把问题交给你,你能不能也很快的找出所有和为S的连续正数序列? Good Luck!输出描述:输出所有和为S的连续正数序列。序列内...原创 2019-08-05 11:25:11 · 66 阅读 · 0 评论 -
和为S的两个数字
题目描述输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。输出描述:对应每个测试案例,输出两个数,小的先输出。思路:证明如下,清晰明了://输出两个数的乘积最小的。这句话的理解?假设:若b>a,且存在,a + b = s;(a - m ) + (b + m) = s则:(a -...原创 2019-08-05 15:09:33 · 72 阅读 · 0 评论 -
翻转单词顺序列
题目描述牛客最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句子在本子上。同事Cat对Fish写的内容颇感兴趣,有一天他向Fish借来翻看,但却读不懂它的意思。例如,“student. a am I”。后来才意识到,这家伙原来把句子单词的顺序翻转了,正确的句子应该是“I am a student.”。Cat对一一的翻转这些单词顺序可不在行,你能帮助他么?思路:算法思想:...原创 2019-08-05 16:07:19 · 66 阅读 · 0 评论 -
扑克牌顺子
题目描述LL今天心情特别好,因为他去买了一副扑克牌,发现里面居然有2个大王,2个小王(一副牌原本是54张^_^)...他随机从中抽出了5张牌,想测测自己的手气,看看能不能抽到顺子,如果抽到的话,他决定去买体育彩票,嘿嘿!!“红心A,黑桃3,小王,大王,方片5”,“Oh My God!”不是顺子.....LL不高兴了,他想了想,决定大\小 王可以看成任何数字,并且A看作1,J为11,Q为12,K...原创 2019-08-05 17:28:08 · 103 阅读 · 0 评论 -
孩子们的游戏(圆圈中最后剩下的数)
题目描述每年六一儿童节,牛客都会准备一些小礼物去看望孤儿院的小朋友,今年亦是如此。HF作为牛客的资深元老,自然也准备了一些小游戏。其中,有个游戏是这样的:首先,让小朋友们围成一个大圈。然后,他随机指定一个数m,让编号为0的小朋友开始报数。每次喊到m-1的那个小朋友要出列唱首歌,然后可以在礼品箱中任意的挑选礼物,并且不再回到圈中,从他的下一个小朋友开始,继续0...m-1报数....这样下去.....原创 2019-08-06 14:43:16 · 69 阅读 · 0 评论 -
数组中重复的数字
题目描述在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是第一个重复的数字2。class Solution {public: // Parameters: // ...原创 2019-08-06 15:26:28 · 76 阅读 · 0 评论 -
把字符串转换成整数
题目描述将一个字符串转换成一个整数(实现Integer.valueOf(string)的功能,但是string不符合数字要求时返回0),要求不能使用字符串转换整数的库函数。 数值为0或者字符串不是一个合法的数值则返回0。输入描述:输入一个字符串,包括数字字母符号,可以为空输出描述:如果是合法的数值表达则返回该数字,否则返回0示例1输入+2147483647 ...原创 2019-08-06 16:22:43 · 143 阅读 · 0 评论 -
正则表达式匹配
题目描述请实现一个函数用来匹配包括'.'和'*'的正则表达式。模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(包含0次)。 在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"ab*ac*a"匹配,但是与"aa.a"和"ab*a"均不匹配思路:解这题需要把题意仔细研究清楚,反正我试了好多次才明白的。首先,...原创 2019-08-06 21:16:14 · 88 阅读 · 0 评论 -
链表中环的入口结点
题目描述给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。思路:两个结论:1、设置快慢指针,假如有环,他们最后一定相遇。2、两个指针分别从链表头和相遇点继续出发,每次走一步,最后一定相遇与环入口。证明结论1:设置快慢指针fast和low,fast每次走两步,low每次走一步。假如有环,两者一定会相遇(因为low一旦进环,可看作fast在后面追赶low...原创 2019-08-06 22:21:25 · 75 阅读 · 0 评论 -
删除链表中重复的结点
题目描述在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5思路:1. 首先添加一个头节点,以方便碰到第一个,第二个节点就相同的情况2.设置 pre ,cur指针, pre指针指向当前确定不重复的那个节点,而cur...原创 2019-08-06 23:48:07 · 91 阅读 · 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&g...原创 2019-07-18 23:30:45 · 57 阅读 · 0 评论 -
数组中出现次数超过一半的数字
题目描述数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。解法一:因为用了sort快排, 复杂度为nlogn,并不是最优class Solution {public: int MoreThanHalfNum_Solu...原创 2019-07-10 00:39:13 · 103 阅读 · 3 评论 -
树的子结构
题目描述输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)思路:首先在树A中找到和树B根节点值相同的节点R;然后判断树A中以R为根节点的子树是否包含了和树B一样的结构。递归版:/*struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right;...原创 2019-06-24 23:50:36 · 67 阅读 · 0 评论 -
反转链表
题目描述输入一个链表,反转链表后,输出新链表的表头。代码:/*struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next(NULL) { }};*/class Solution {public: ListNode* ReverseList(ListNod...原创 2019-06-19 12:44:46 · 70 阅读 · 0 评论 -
重建二叉树
输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。思路:先序遍历第一个位置肯定是根节点node,中序遍历的根节点位置在中间p,在p左边的肯定是node的左子树的中序数组,p右边的肯定是node的右子树的中序...原创 2019-06-14 15:12:48 · 105 阅读 · 0 评论 -
用两个栈实现队列
用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。思路:将压入队列的数先压入stack1,再弹到stack2.就可以实现队列的"先入先出"的功能.但值得注意的是,1.在队列进行"入队"操作的时候,其实就是把数字压入stack1.但是将数字压入stack1时候要保证stack2是空的,如果不是空的,就得先将stack2中的值先压入stack1,然后再...原创 2019-06-14 18:32:17 · 85 阅读 · 0 评论 -
旋转数组的最小数字
题目描述把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。class Solution {public: int minNumberInRotateArr...原创 2019-06-14 20:59:56 · 74 阅读 · 0 评论 -
斐波那契数列
题目描述大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0)。n<=39代码:非递归的:class Solution {public: int Fibonacci(int n) { int f[45]; f[0]=0; f[1]=1; for(int i...原创 2019-06-14 21:36:42 · 102 阅读 · 0 评论 -
跳台阶
题目描述一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。思路:根据最后一次跳台阶的数目可以分为两种情况.最后一次跳1步台阶和最后一次跳2步台阶.设跳n级台阶总共有f(n)种跳法.则有f(n)=f(n-1)+f(n-2); f(1)=1;f(2)=2;class Solution {public: ...原创 2019-06-14 21:59:25 · 78 阅读 · 0 评论 -
变态跳台阶
题目描述一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。思路:这道题是跳台阶的进阶版,但大致思路是一样的.当青蛙跳n级台阶时,根据青蛙最后一次跳上的台阶数可以分为最后1次跳1级台阶,最后1次跳2级台阶,一直到最后1次跳n级台阶.则有f(n)=f(n-1)+f(n-2)+...+f(0),f(0)=1.代码:clas...原创 2019-06-15 11:36:17 · 79 阅读 · 0 评论 -
替换空格
题目描述请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。思路:1.统计字符串长度和空格数目,以此计算新的字符串的长度(newNum=oldNum+2*count;//不包括‘\0’的长度);2.由后往前遍历字符串,若当前字符非空格,则将当前字符赋给对应新字符串;否则依次赋予...原创 2019-06-11 00:09:27 · 118 阅读 · 0 评论 -
数值的整数次方
题目描述给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。按通常思路,但时间耗时还是挺多的,毕竟CPU不善于计算乘法,更善于移位操作.通常思路对应的代码:class Solution {public: double Power(double base, int exponent) { ...原创 2019-06-16 19:34:23 · 70 阅读 · 0 评论 -
调整数组顺序使奇数位于偶数前面
题目描述输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。思路1:将原来数组中的奇数和偶数都找出来,分别存储,然后将偶数存入奇数数组,最后赋给一开始传入的数组.代码:class Solution {public: void reOrderArray(ve...原创 2019-06-17 13:46:37 · 96 阅读 · 0 评论 -
从尾到头打印链表
题目描述输入一个链表,按链表值从尾到头的顺序返回一个ArrayList。解法1:主要借助栈的前进后出性质,然后再依次弹出存到vector容器中。/*** struct ListNode {* int val;* struct ListNode *next;* ListNode(int x) :* va...原创 2019-06-11 23:47:06 · 80 阅读 · 0 评论 -
二叉树的镜像
题目描述操作给定的二叉树,将其变换为源二叉树的镜像。输入描述:二叉树的镜像定义:源二叉树 8 / \ 6 10 / \ / \ 5 7 9 11 镜像二叉树 8 / \ 10 6 / \ / \ 11 9 7 5...原创 2019-06-25 18:42:23 · 105 阅读 · 0 评论 -
包含min函数的栈
题目描述定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1))。代码:class Solution {public: stack<int > dataStack,minStack; //一个是数据栈,用来正常存储压入的数据, //一个是最小栈,用来存储当前压入数据后此时数据栈中的最小值,并都保存在栈顶...原创 2019-06-26 21:42:41 · 62 阅读 · 0 评论 -
合并两个排序的链表
输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。代码:/*struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next(NULL) { }};*/class Solution {...原创 2019-06-24 00:39:39 · 66 阅读 · 0 评论 -
栈的压入、弹出序列
题目描述输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)思路:主要采用模拟堆栈操作的思想:将原数列依次压栈,然后将栈顶元素与所给出栈弹...原创 2019-06-26 23:54:50 · 121 阅读 · 0 评论 -
二叉树的下一个结点
题目描述给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。结合图,我们可发现分成两大类:1、有右子树的,那么下个结点就是右子树最左边的点; 2、没有右子树的,也可以分成两类,a)是父节点左孩子 ,那么父节点就是下一个节点 ; b)是父节点的右孩子,找他的父节点的父节点的父节点...直到当前结点是其父节点的...原创 2019-08-07 10:48:31 · 74 阅读 · 0 评论