剑指offer
文章平均质量分 57
杜甫如诗
这个作者很懒,什么都没留下…
展开
-
一个链表中包含环,请找出该链表的环的入口结点。
思路:1.通过两个指针,一个一次走一个节点,一个走两个,如果快的追上慢的,则说明有环 2.且,追上处的节点为环中的一个节点,从该节点一次走一步计数,当回到原地,可知环的节点数 3.两个指针都从链表头开始走,一个先走环的节点数;然后两个同时走,当两个相遇时,相遇节点为环的入口节点/*struct ListNode { int val;原创 2017-08-24 11:53:45 · 493 阅读 · 0 评论 -
请实现一个函数用来匹配包括'.'和'*'的正则表达式。模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(包含0次)。 在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字
剑指offer:请实现一个函数用来匹配包括'.'和'*'的正则表达式。模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(包含0次)。 在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"ab*ac*a"匹配,但是与"aa.a"和"ab*a"均不匹配思路:情况非常复杂,利用递归思路,可以大大简化问题。其实,递归就是一步一步解决问题。原创 2017-08-17 00:42:53 · 4349 阅读 · 2 评论 -
把只包含因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。
剑指offer:把只包含因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。思路1:对每个数进行整除2 3 5,看余数是不是1。这个办法会很蠢。思路2:第一个丑数是1,第二个是2第几个 1 23 4 5 67 8 9原创 2017-07-24 22:41:33 · 2940 阅读 · 0 评论 -
输入一个正整数数组,输入一个正整数数组,把数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。
剑指offer:输入一个正整数数组,输入一个正整数数组,把数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。思路:两个数比较,哪个更适合放在前面,可以将两个数拼起来,谁放在前面,拼起来的数小,谁就更适合放在前面。关键是要会用,stringstream做int和string的转换,还要会用sort排序。代码如下:#incl原创 2017-07-24 21:54:14 · 1849 阅读 · 0 评论 -
求1+2+3+...+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)
class Solution {public: int Sum_Solution(int n) { int ans = n; ans && (ans += Sum_Solution(n - 1)); return ans; }};分析:&& 运算,当前面为假时,后面自动不算。原创 2017-08-09 09:27:15 · 2926 阅读 · 0 评论 -
每年六一儿童节,牛客都会准备一些小礼物去看望孤儿院的小朋友,今年亦是如此。HF作为牛客的资深元老,自然也准备了一些小游戏。其中,有个游戏是这样的:首先,让小朋友们围成一个大圈。然后,他随机指定一个数m
剑指offer:每年六一儿童节,牛客都会准备一些小礼物去看望孤儿院的小朋友,今年亦是如此。HF作为牛客的资深元老,自然也准备了一些小游戏。其中,有个游戏是这样的:首先,让小朋友们围成一个大圈。然后,他随机指定一个数m,让编号为0的小朋友开始报数。每次喊到m-1的那个小朋友要出列唱首歌,然后可以在礼品箱中任意的挑选礼物,并且不再回到圈中,从他的下一个小朋友开始,继续0...m-1报数....这样下去原创 2017-08-01 21:47:55 · 3962 阅读 · 0 评论 -
扑克牌中的顺子
剑指offer:题目描述LL今天心情特别好,因为他去买了一副扑克牌,发现里面居然有2个大王,2个小王(一副牌原本是54张^_^)...他随机从中抽出了5张牌,想测测自己的手气,看看能不能抽到顺子,如果抽到的话,他决定去买体育彩票,嘿嘿!!“红心A,黑桃3,小王,大王,方片5”,“Oh My God!”不是顺子.....LL不高兴了,他想了想,决定大\小 王可以看成任何数字,并且A看原创 2017-08-01 20:57:49 · 435 阅读 · 0 评论 -
翻转字符串
牛客最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句子在本子上。同事Cat对Fish写的内容颇感兴趣,有一天他向Fish借来翻看,但却读不懂它的意思。例如,“student. a am I”。后来才意识到,这家伙原来把句子单词的顺序翻转了,正确的句子应该是“I am a student.”。Cat对一一的翻转这些单词顺序可不在行,你能帮助他么?思路:先翻转整体,再一个单词原创 2017-08-01 20:27:59 · 233 阅读 · 0 评论 -
汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果。对于一个给定的字符序列S,请你把其循环左移K位后的序列输出。例如,字符序列S=”abcXYZde
剑指offer:汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果。对于一个给定的字符序列S,请你把其循环左移K位后的序列输出。例如,字符序列S=”abcXYZdef”,要求输出循环左移3位后的结果,即“XYZdefabc”。是不是很简单?OK,搞定它!思路:太简单,看代码class Solution {public: stri原创 2017-08-01 19:37:43 · 5944 阅读 · 0 评论 -
输入一个递增排序的数组和一个数字S,在数组中查找两个数,是的他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的
剑指offer:输入一个递增排序的数组和一个数字S,在数组中查找两个数,是的他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的思路3 > 思路2 > 思路1首先,递增数列有个规律,如果两个数和相同而要乘积小,则两个数一定是在两边的,如 -2,-1,0,1,2,3,4,5 (-,2,2) 和 (-1,1)和都为0,但是前者乘积更小。思路1:有连个元素,s1 和 s2.假原创 2017-08-01 19:17:35 · 1002 阅读 · 0 评论 -
小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100。但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数)。没多久,他就得到另一
剑指offer:小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100。但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数)。没多久,他就得到另一组连续正数和为100的序列:18,19,20,21,22。现在把问题交给你,你能不能也很快的找出所有和为S的连续正数序列? Good Luck!思路:1)判断边界条件,sum不原创 2017-08-01 16:38:00 · 2519 阅读 · 0 评论 -
在一个字符串(1<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置
剑指offer:在一个字符串(1思路:用空间换时间。1)建立一个长为256的数组,其实全部由字母组成也可以建立一个长度26*2=52的数组,但是稍微麻烦,这里不使用。将所有元素全部初始化为0;2)遍历字符串,将对应字符对应的数组元素加一;3)再次遍历字符串,直到找到第一个字符对应的数组元素值为1的元素。代码1:用c中的char*字符串,由于题中给出的是str类型,因此需要转换。刚开始还原创 2017-07-26 11:09:43 · 3552 阅读 · 0 评论 -
在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出。 即输出P%100000000
剑指offer:在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出。 即输出P%1000000007思路:链接:归并排序启发得来,把数据分成前后两个数组(递归分到每个数组仅有一个数据项),合并数组,合并时,从后往前遍历,出现前面的数组值array[i]大于后面数组值array[原创 2017-07-26 21:30:09 · 1906 阅读 · 0 评论 -
写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号
class Solution {public: int Add(int num1, int num2)//将加法分为进位的部分和不进位的部分,和为两部分之和 { int n1 = (num1 & num2) << 1;//进位的部分 int n2 = num1 ^ num2;//不用进位的部分 while(n1 & n2){//当进原创 2017-08-11 11:13:31 · 609 阅读 · 0 评论 -
请实现一个函数用来找出字符流中第一个只出现一次的字符。例如,当从字符流中只读出前两个字符"go"时,第一个只出现一次的字符是"g"。当从该字符流中读出前六个字符“google"时,第一个只出现一次的字
class Solution{ private: int occurence[256]; private: int index; public: Solution(){ for(int i=0;i occurence[i] = -1; } index = 0; }原创 2017-08-24 09:24:45 · 745 阅读 · 0 评论 -
请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100","5e2","-123","3.1416"和"-1E-16"都表示数值。 但是"12e","1a3.14","1.
using namespace std;class Solution {public:bool scanUnsignedInteger(char** str){const char* before = *str;while(**str!='\0' && **str >= '0' && **str ++(*str);//当str中存在若干0-9的数字时,返回tru原创 2017-08-24 00:13:57 · 2909 阅读 · 1 评论 -
在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5
/*struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next(NULL) { }};*/class Solution {public: ListNode* deleteDuplication(ListNode* pHead)原创 2017-08-24 21:11:56 · 3023 阅读 · 0 评论 -
输入一棵二叉树,判断该二叉树是否是平衡二叉树
剑指offer:输入一棵二叉树,判断该二叉树是否是平衡二叉树思路:核心是用一个函数,既能返回深度,又能返回是否平衡。IsBalanced_Solution_Core函数既能求树的深度,又可以返回是否是平衡二叉树,如果不平衡,则返回-1如果节点为空,返回0;递归求左子树的深度和是否平衡,如果左子树不平衡,返回-1;递归求右子树的深度和是否平衡,如果右子树不平衡,返回-1;如果上面条件都不满足,则原创 2017-07-28 22:08:25 · 337 阅读 · 0 评论 -
输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。
剑指offer:输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。思路:必须遍历整棵树,有三种遍历方式,前序、后续和中序。这里不用访问节点值,指的是计数。采用前序。/*struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right;原创 2017-07-28 21:23:33 · 4428 阅读 · 0 评论 -
统计一个数字在排序数组中出现的次数。
剑指offer:统计一个数字在排序数组中出现的次数。思路:改进二分查找算法,找到第一个K出现的索引,和第最后一个k的索引。class Solution {public: int GetNumberOfK(vector data ,int k) { //必须先考虑边境条件 int vecLen = data.size(); if(ve原创 2017-07-28 20:17:40 · 466 阅读 · 0 评论 -
输入两个链表,找出它们的第一个公共结点。
剑指offer:输入两个链表,找出它们的第一个公共结点。思路:如果两个链表有公共节点,那么它们在第一个公共节点以后的节点都相同。1)分别求出两个链表的长度length1和length2;2)求出两个链表长度差dif;3)让长的链表先从头往后先走dif步4)连个链表同时走,直到指针相同为止,返回当前指针。5)如果两链表走到头也地址不相同,则返回NULL代码如下:/*原创 2017-07-27 16:21:58 · 381 阅读 · 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]。不能使用除法
思路:B[i]=A[0]*A[1]*...*A[i-1]*A[i+1]*...*A[n-1] 先把A[0]*A[1]*...A[i]算出来,载乘以A[i-1]*A[i+1]*...*A[n-1]class Solution {public: vector multiply(const vector& A) { int len = A.size();原创 2017-08-11 13:36:00 · 3955 阅读 · 0 评论 -
在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 例如,如果输入长度为7的数组{
class Solution {public: // Parameters: // numbers: an array of integers // length: the length of array numbers // duplication: (Output) the duplicat原创 2017-08-11 12:54:06 · 2058 阅读 · 0 评论 -
将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数。 数值为0或者字符串不是一个合法的数值则返回0
剑指offer:将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数。 数值为0或者字符串不是一个合法的数值则返回0注意:C++中的string结尾不一定为NULL(/0)输入描述:输入一个字符串,包括数字字母符号,可以为空输出描述:如果是合法的数值表达则返回该数字,否则返回0示例1输入+2147483647 1原创 2017-08-11 12:12:46 · 1000 阅读 · 0 评论 -
从1到n个自然数中,各个数位包含1的个数
剑指offer:求出1~13的整数中1出现的次数,并算出100~1300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1、10、11、12、13因此共出现6次,但是对于后面问题他就没辙了。ACMer希望你们帮帮他,并把问题更加普遍化,可以很快的求出任意非负整数区间中1出现的次数思路:分三个部分。以21345为例 1)最高位中包含1的个数numFirstDigit:2)从1原创 2017-07-18 19:42:42 · 877 阅读 · 0 评论 -
输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。
剑指offer:输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。思路:本题考查递归解决问题的思路。首先将输入的字符串转化为有序字符串。将字符串分为两部分,第一个字符,和后续N-1个字符。后续问题可以用递归函数。按顺序确定第一个字符,然后递归操作剩下的N-1个字符(要原创 2017-07-10 14:38:16 · 6177 阅读 · 0 评论 -
输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。
剑指offer:输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。这道题是湖南2011年高考理工类的试题,是一道天空压轴题。难住了本科自称数学天才的室友,哈哈~用计算机却如此简单这里介绍一点补码的知识,补码这个东西就是为了方便计算机的计算产生的,由于计算机在计算的时候,寄存器位数是有限的,所以如果数值大于或等于它的模,就会溢出。因此正数的补码就是它本身,负数的补码就是它的模减原创 2017-06-26 16:08:45 · 758 阅读 · 0 评论 -
我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?
剑指offer:我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?思路:这道题非常像斐波那契数列,只不过初始两项不通。是一道找规律题,方法一:是通过把头几项,都算出来找规律,如1、2、3、5、8....找出递归式。第二种是通过原理去证明递归式。我倾向于第二种,因为这才能给人百分之百正确的感觉,逻辑是完整的。至于证原创 2017-06-26 15:02:45 · 1497 阅读 · 2 评论 -
操作给定的二叉树,将其变换为源二叉树的镜像。
剑指offer:操作给定的二叉树,将其变换为源二叉树的镜像。思路:详见代码。注意:树不为空,但是左右子树可以同时为空。比如叶子结点。/*struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(原创 2017-07-05 11:27:27 · 450 阅读 · 0 评论 -
一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法
剑指offer:一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法这道题关键是搞懂数学问题,之后就是斐波那契额数列的做法了。青蛙跳的函数关系是f(n) = f(n-1) + f(n-2) 其中f(1) =1 ; f(2) = 2;代码就不写了,参加我上一题的解答。原创 2017-06-26 11:13:34 · 691 阅读 · 0 评论 -
大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项。 n<=39
剑指offer:大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项。n解题思路:斐波那契数列:F(0)=0,F(1)=1, F(n)=F(n-1)+F(n-2)(n>=2,n∈N*)最直观的想法就是利用函数的递归来做。但是细思,发现时间时间复杂度和空间复杂度都极大,复杂度是O(2^n)。我也写了相关代码,严重超时。那么第一种思路:原创 2017-06-26 10:01:42 · 8717 阅读 · 1 评论 -
把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数
剑指offer:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。思路:本题有歧义,只能遍历。class Solution {public: int mi原创 2017-06-25 22:04:35 · 2335 阅读 · 0 评论 -
输入一个链表,从尾到头打印链表每个节点的值。
网上搜到了两种方式,但是都没有完整可以一键运行的代码。下面提供代码给像我一样的菜鸟学习。第一种方法:利用stack 先遍历链表,将链表节点的指针存入stack中,再依次将这些指针出栈,将指针对应的数值存入数组中。完整代码如下:// staticTest.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include #include #inclu原创 2017-06-22 22:14:21 · 389 阅读 · 0 评论 -
输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5
剑指ofeer:输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。解题思路:在二叉树的先序遍历中,第一个数字总是根节点的值。二叉树的中序遍历中,左子树的元素总是在根节点左边。由此两条,便可递归重构二叉树。代码如...原创 2017-06-25 20:34:00 · 1362 阅读 · 0 评论 -
数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在
剑指offer:数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。思路1:注意到目标数 超过数组长度的一半,对数组同时去掉两个不同的数字,到最后剩下的一个数就是该数字。如果剩下两个,那么这两个也是一样的,就是结果),在其基础上把原创 2017-07-10 16:40:35 · 1065 阅读 · 0 评论 -
输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)
剑指offer:输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)思路:这道题用到函数递归,比较绕。第一个函数bool DoseTree1HasTree2(TreeNode* tree1, TreeNode* tree2)用来判断,第一棵树从当前节点开始是不是包含第二棵树。当中会用到递归自己。第二个函数bool HasSubtree(TreeNo原创 2017-06-30 16:47:32 · 554 阅读 · 0 评论 -
给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方
剑指offer:给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方这道题要考虑的指数正和反的区别,另外注意,result的初始值是1;思路就不写了,直接看代码;class Solution {public: double Power(double base, int exponent) { double res原创 2017-06-26 16:41:29 · 1953 阅读 · 0 评论 -
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1,2,3,4,8
剑指offer:输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵: 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.思路:这个题考虑的情况比较多,考察的是细心程度和面对复杂问题的逻辑分析能力。耐心分析就好。首先在while里原创 2017-07-05 17:03:44 · 5905 阅读 · 0 评论 -
定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数。
剑指offer:定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数。思路,用一个minStac堆栈存储最小值,与dataStack堆栈同时存储其实也可以自己用数组和单向链表实现堆栈。这里采用stack,快一点代码如下:class Solution {public: stack dataStack,minStack; void push(原创 2017-07-05 20:15:16 · 330 阅读 · 0 评论 -
输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。
剑指offer:输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。思路一:用一个multiset存储k个数,后面得到一个数,如果得到的数字比leastNumbers中的最大值大,则舍去,否则删掉最大值,插入得到的数到multiset中。直到所有的n-k数走一遍。则multiset中的k个数便是n个数中最小的k个数。由于原创 2017-07-17 21:42:58 · 4331 阅读 · 0 评论