
剑指Offer
文章平均质量分 68
烽火前秦路
厚积薄发,知识改变命运!
展开
-
剑指Offer----面试题25:二叉树中和为某一值的路径
题目:题目:输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。从树的根节点往下一直到叶节点所经过的结点形成一条路径。分析:官方源代码:/* 题目:输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。 从树的根节点往下一直到叶节点所经过的结点形成一条路径。*/#include"Binary原创 2016-06-06 11:22:35 · 469 阅读 · 0 评论 -
剑指Offer----面试题34:丑数
题目:我们把只包含因子2、3和5的数成为丑数,求按从小到大的顺序的第1500个丑数。例如6、8都是丑数,但14不是,因为它包含因子7。习惯上我们把1当做第一个丑数。方法一:分析:逐个判断整数是不是丑数,直观但是效率低下。根据丑数的定义,丑数只能被2、3和5整除,也就是说一个数能被2整除,我们把它连续除以2;如果能被3整除,我们将它连续除以3;如果原创 2016-07-31 22:22:23 · 863 阅读 · 0 评论 -
剑指Offer----面试题35:第一个只出现一次的字符
题目:在字符串中找出第一个只出现一次的字符。如输入“abaccdeff”,则输出'b';方法一:方法分析:从头开始扫描字符,如果从头到尾(除了自己以外)没有遇到相同的字符,则返回自己,否则,进行下一个字符的扫描,如果没有只出现一次的字符或者输入的字符串为空则返回' ';源代码如下:/* 在字符串中找出第一个只出现一次的字符。如输入“abaccd原创 2016-08-01 00:16:02 · 353 阅读 · 0 评论 -
剑指Offer----面试题35:扩展----第一个字符串中删除第二个字符串中出现过的所有字符
题目:定义一个函数,输入两个字符串,从第一个字符串中删除在第二个字符串中出现过的所有字符。例如从第一个字符串"We are students"中删除第二个字符串“aeiou”中出现过的字符得到的结果就是“W r stdnts”。分析:为了解决这个问题,我们可以创建一个用数组实现的简单哈希表来存储第二个字符串。这样我们从头到尾扫描第一个字符串中的每一个字符时,用O原创 2016-08-01 11:38:25 · 1479 阅读 · 0 评论 -
剑指Offer----面试题35:扩展----删除字符串中所有重复出现的字符 & 变位词
题目:定义一个函数,删除字符串中所有重复出现的字符。例如输入“google”,删除重复的字符之后的结果就是“gole”。分析:这个题目和上面的问题比较类似,我们可以创建一个用布尔类型数组实现的简单的哈希表。数组中的元素的意义是其下标看做ASCII后对应的字母在字符串中是否已经出现。我们先把数组中所有的元素设为false。以“google”为例,当扫描第一个g时,原创 2016-08-01 11:58:12 · 1193 阅读 · 0 评论 -
剑指Offer----面试题36:数组中的逆序对
题目:在数组中的两个数字如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。方法一:分析:扫描整个数组,每扫描一个数字的时候,逐个比较该数字和它后面的数字的大小。如果后面的数字比他小,则这两个数字就组成一个逆序对。时间复杂度为O(n2)。代码:#includeusing namesp原创 2016-08-01 12:23:58 · 328 阅读 · 0 评论 -
剑指Offer----面试题37:两个链表的第一个公共结点
剑指Offer原创 2016-08-01 16:24:34 · 525 阅读 · 1 评论 -
剑指Offer----面试题38:数字在排序数组中出现的次数
题目:统计一个数字在排序数组中出现的次数。例如输入排序数组{1,2,3,3,3,3,4,5}和数字3,由于3在这个数组中出现了4次,因此输出4。方法一从前向后一次查找。源代码如下:/* 统计一个数字在排序数组中出现的次数。例如输入排序数组{1,2,3,3,3,3,4,5}和数字3,由于3在这个数组中 出现了4次,因此输出4*/#in原创 2016-08-01 20:27:17 · 647 阅读 · 0 评论 -
剑指Offer----面试题39(1):二叉树的深度
题目:输入一颗二叉树的根结点,求该树的深度。从根结点到叶节点依次经过的结点(含根、叶节点)形成树的一条路径,最长路径的长度为树的深度。分析如果一颗树只有一个根结点,那么该树的深度为1。如果该树只有左子树没有右子树,那么该树的深度应该是左子树的深度加1;同理,如果该树只有右子树而没有左子树,那么该树的深度应该是右子树的深度加1。如果该树既有左子树又有右子树,那么该树的深度原创 2016-08-01 21:00:56 · 358 阅读 · 0 评论 -
剑指Offer----面试题33:把数组排成最小的数
题目:输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼出得搜数字中最小的一个。例如输入{3,32,321},则打印出这3个数字能排成的最小数字321323.方法一:分析:先求出这个数组中所有数字的全排列,然后把每个排列拼接起来,最后求出拼接起来的数字的最小值。源代码:#include#include#includeusin原创 2016-07-30 17:59:52 · 433 阅读 · 0 评论 -
剑指Offer----面试题32:从1到n整数中1出现的次数
题目:输入一个整数n,求从1到n这n个整数的十进制表示中1出现的次数。例如输入12,从1到12这些整数中包含1的数字有1,10,11,12,也就是说1出现了5次。方法一:不考虑时间复杂度的解法分析:循环遍历从1到n的每一个数字,累加每一个数字中所包含的1的个数,如果输入数字n,n有O(logn)位,那么时间复杂度就是O(n*longn)。原创 2016-07-30 16:17:11 · 786 阅读 · 1 评论 -
剑指Offer----面试题31:连续子数组的最大和
题目:输入一个整型数组,数组里有正数也有负数,数组中一个或连续的多个整数数组组成一个子数组。求所有子数组的和的最大值。要求时间复杂度为O(n).分析:例如输入数组 1, -2, 3, 10, -4, 7, 2, -5 },和最大的子数组为{3,10,-4,7,2},因此输出为该子数组的和为18.源代码:#include#原创 2016-07-30 15:58:08 · 356 阅读 · 0 评论 -
剑指Offer----面试题27:二叉搜索树与双向链表
题目:输入一颗二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。如下图中的二叉搜索树,则输出转换之后的排序双向链表。分析:中序遍历算法的特点是按照从小到大的顺序遍历二叉树的每一个结点。当遍历到根节点的时候,可以把树分为三部分:值为10的结点,根节点值为6的左子树,根节点值为14的右子树。根据排序链表原创 2016-06-06 18:02:33 · 464 阅读 · 0 评论 -
剑指Offer----面试题28----扩展:字符的所有组合
题目:求字符的所有组合,例如输入abc, 则他们的所有组合有a、b、c、ab、ac、bc、abc。分析:如果输入n个字符,则这n个字符所构成长度为1的组合,长度为2的组合,......,长度为n的组合。求n个字符的长度为m(1源代码如下:#include#include#includeusing namespace std;static int原创 2016-06-06 22:41:40 · 1394 阅读 · 1 评论 -
剑指Offer----面试题28:字符串的排列 & 去重
题目:输入一个字符串,打印出该字符串中字符的所有排列。例如输入字符串abc,则打印输出字符a、b、c所能排列出来的所有字符串abc、acb、bac、bca、cab、cba。分析:首先求得所有可能出现在第一个位置上的字符,即把第一个字符和后边所有的字符交换;固定第一个字符,求后面所有字符的排列。如abc:第一步:将第一行数据分别和第二行和第三行数据交换原创 2016-06-06 21:52:40 · 1040 阅读 · 0 评论 -
剑指Offer----面试题28----扩展:从1到n中随意取若干数使之与某一数相等
题目输入两个整数n和m,从数列1,2,3...n中随意取几个数,使其和等于m,要求列出所有的组合。源代码:#include #include using namespace std;list list1;void find_factor(int sum, int n){ //递归出口 if (n <= 0 || sum <= 0) return;原创 2016-06-06 23:52:18 · 575 阅读 · 0 评论 -
剑指Offer----面试题28----扩展:八皇后问题
题目:在8×8的国际象棋上摆放八个皇后,使其不能相互攻击,即任意两个皇后不得处在同一行、同一列或者同一对角斜线上。下图中的每个黑色格子表示一个皇后,这就是一种符合条件的摆放方法。请求出总共有多少种摆法?分析:由于八个皇后的任意两个不能处在同一行,那么这肯定是每一个皇后占据一行。于是我们可以定义一个数组ColumnIndex[8],数组中第i个数字表示位于第i原创 2016-06-06 22:55:49 · 690 阅读 · 0 评论 -
剑指Offer----面试题17:合并两个排序的链表
题目:输入两个递增排序的链表,合并这两个链表并使新链表中的结点仍然按照递增排序。如下图所示:方法一:分析:创建新的链表3,每次比较链表1和2上相应的值,再链表3上依次创建新的结点,并将各个结点连接起来。源代码:#include"List.h"#includeusing std::cout;using std::endl;usi原创 2016-06-04 12:53:02 · 586 阅读 · 0 评论 -
剑指Offer----面试题22:栈的压入、弹出序列
题目:输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1/2/3/4/5是某栈的压入序列,序列4/5/3/2/1是该栈序列对应的一个弹出序列,但是4/3/5/1/2就不是该压栈序列的弹出序列。分析:建立一个辅助栈,将一个序列中的数字依次压入栈,依次弹出并和第二个序列中的栈相比较。原创 2016-06-05 13:48:06 · 428 阅读 · 0 评论 -
剑指Offer----面试题26:复杂链表的复制
题目:请实现哈数ComplexListNode *Clone(ComplexListNode *pHead),复制一个复杂链表。在复杂链表中,每个结点除了有一个next指针指向下一个结点外,还有一个sibling指向链表的任意结点或者NULL。分析:如下图是一个含有5个结点的复杂链表,实箭头代表next指针,虚箭头代表sibling指针。指向NULL的指针没有画出。原创 2016-06-06 16:44:13 · 439 阅读 · 0 评论 -
剑指Offer----面试题39(2):判断是否为平衡二叉树
题目:输入一颗二叉树的根节点,判断该树是不是平衡二叉树。如果某二叉树中任意结点的左右子树的深度相差不超过1,那么它就是一颗平衡二叉树。分析:遍历每个结点的时候,调用函数TreeDepth得到它的左右树的深度。如果每个结点的左右子树的深度相差不超过1,按照定义它就是一颗平衡二叉树。代码#include"BinaryTree.h"#includ原创 2016-08-01 21:45:05 · 484 阅读 · 0 评论 -
剑指Offer----面试题40:数组中出现一次的数字
题目:一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度为O(n),空间复杂度为O(1)。分析例如输入数组{2,4,3,6,3,2,5,5},因为只有4、6这两个数字出现一次,其他数字出现了两次,所以输出4、6。源码#includeusing namespac原创 2016-08-01 23:36:04 · 305 阅读 · 0 评论 -
剑指Offer----扩展:上台阶(京东)
问题描述:有一楼梯共m级,刚开始时你在第一级,若每次只能跨上一级或者二级,要走上m级,共有多少走法?注:规定从一级到一级有0种走法。给定一个正整数int n,请返回一个数,代表上楼的方式数。保证n小于等于100。为了防止溢出,请返回结果Mod 1000000007的值。测试样例:3返回:2分析:这不就是典型的动态规划问题吗,同时也是斐波那契数原创 2016-08-29 11:20:26 · 1038 阅读 · 0 评论 -
剑指Offer----扩展:选择题(京东)
问题描述:设一课完全二叉树共有999个结点,则在该二叉树中的叶节点个数是?分析:在二叉树的第i层上至多有2^(n-1)个结点(n>=1);深度为k的二叉树至多有2^k-1个结点(k>=1).因为2^9-1 方法二:其实完全二叉树有这个性质,最后一个节点/2就得到他的父节点了,而此时的父节点必然是最后一个父节点,也就是说他之后的原创 2016-08-29 12:02:11 · 1030 阅读 · 0 评论 -
剑指Offer----扩展:空格问题(京东)
问题描述:给定字符串(ASCII码0-255)数组,请在不开辟额外空间的情况下删除开始和结尾处的空格,并将中间的多个连续的空格合并成一个。例如:" i am a little boy. ",变成"i am a little boy",语言不限,但不要用伪代码作答,函数输入输出请参考如下的函数原型:C++函数原型:void FormatString(char str[],i原创 2016-08-29 16:00:26 · 1144 阅读 · 0 评论 -
剑指Offer----扩展:二进制(小米)
问题描述:世界上有10种人,一种懂二进制,一种不懂。那么你知道两个int32整数m和n的二进制表达,有多少个位(bit)不同么?输入例子:1999 2299输出例子:7分析:将两个整数逐位进行比较,累加不同位的个数,直至两个数都为0.源代码:#define _CRT_SECURE_NO_WARNINGS#include#include原创 2016-08-28 21:48:45 · 748 阅读 · 3 评论 -
剑指Offer----扩展:删除整型数组中所有的重复元素(中兴)
问题描述:删除整型数组中所有的元素!方法一:使用hash_map方法保存非重复的数字:#include#include#includeusing namespace std;vector dictinctArray(vector &arr){ hash_map mmap; sort(arr.begin(), arr.end()); for原创 2016-08-25 23:41:39 · 660 阅读 · 0 评论 -
剑指Offer----扩展:0-1交换
问题描述:把一个0-1串(只包含0和1的串)进行排序,你可以交换任意两个位置,使所有的0在前边,所有的1在后边,问最少交换的次数?方法分析:两个指针,分别指向头和尾,当头指向1,尾指向0的时候,进行交换,直至两个指针相遇!#include#include#includeint SwapTime(char *arr, int length){ if (arr原创 2016-08-25 16:54:19 · 577 阅读 · 0 评论 -
剑指Offer----扩展:删a复制b
问题描述:删除一个字符串中所有的a,并且赋值所有的b,字符串足够大!关键是倒着复制字符串数组!/* 删除一个字符串所有的a,并且复制所有的b。注:数组足够大!*/#include#includevoid Function(char *str){ if (str == NULL) return; int n = 0, numb = 0;原创 2016-08-25 16:57:52 · 545 阅读 · 0 评论 -
剑指Offer----扩展:小东分苹果(京东)
问题描述:果园里有一堆苹果,一共n头(n大于1小于9)熊来分,第一头为小东,它把苹果均分n份后,多出了一个,它扔掉了这一个,拿走了自己的一份苹果,接着第二头熊重复这一过程,即先均分n份,扔掉一个然后拿走一份,以此类推直到最后一头熊都是这样(最后一头熊扔掉后可以拿走0个,也算是n份均分)。问最初这堆苹果最少有多少个。给定一个整数n,表示熊的个数,返回最初的苹果数。保证有解。原创 2016-08-29 11:15:03 · 1457 阅读 · 0 评论 -
剑指Offer----扩展:抛小球(京东)
问题描述:小东和三个朋友一起在楼上抛小球,他们站在楼房的不同层,假设小东站的楼层距离地面N米,球从他手里自由落下,每次落地后反跳回上次下落高度的一半,并以此类推知道全部落到地面不跳,求4个小球一共经过了多少米?(数字都为整数)给定四个整数A,B,C,D,请返回所求结果。测试样例:100,90,80,70返回:1020分析:其实这道原创 2016-08-29 11:08:44 · 962 阅读 · 0 评论 -
剑指Offer----扩展:年终奖(京东)
问题描述:小东所在公司要发年终奖,而小东恰好获得了最高福利,他要在公司年会上参与一个抽奖游戏,游戏在一个6*6的棋盘上进行,上面放着36个价值不等的礼物,每个小的棋盘上面放置着一个礼物,他需要从左上角开始游戏,每次只能向下或者向右移动一步,到达右下角停止,一路上的格子里的礼物小东都能拿到,请设计一个算法使小东拿到价值最高的礼物。给定一个6*6的矩阵board,其中每个元素为对应原创 2016-08-29 11:00:58 · 659 阅读 · 0 评论 -
剑指Offer----面试题41(1):和为s的两个数字
题目:输入一个递增排序的数组和一个数字s,在数组中查找两个数,使得它们的和正好是s。如果有多对数字的和等于s,输出任意一对即可。方法一:分析先固定其中的一个数字,再依次扫描该数字后边的数字,判断这两个数字的和是否为s,时间复杂度为O(n2)。代码:#includeusing namespace std;void F原创 2016-08-02 10:15:55 · 349 阅读 · 0 评论 -
剑指Offer----面试题41(2):和为s的连续正数序列
题目:输入一个整数s,打印所有和为s的连续正数序列(至少含有两个数)。例如输入15, 由于1+2+3+4+5 = 4+5+6 = 7+8 = 15,所以打印出3个连续序列。分析源码#includeusing namespace std;void print(int small, int big, int sum){ for (in原创 2016-08-02 10:48:29 · 256 阅读 · 0 评论 -
剑指Offer----面试题42(1):翻转单词顺序
题目输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。为简单起见,标点符号和普通字母一样处理。例如输入字符串“I am a student.”,则输出"student. a am I"。方法一使用是stream中的istringstream绑定输入的字符串,依次读取每个单词,并将该单词存储在栈中,待单词读取完,从栈顶依次取出元素即可。源原创 2016-08-02 11:45:14 · 681 阅读 · 0 评论 -
剑指Offer----面试题42(2):左旋转字符串
题目:字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。比如输入字符串“abcdefg”和数字2,该函数将返回左旋转2位得到的结果“cdefgab”。方法一分析利用string字符串的substr函数截取子串,再进行黏贴。源码#include#includeusing na原创 2016-08-02 12:33:07 · 360 阅读 · 0 评论 -
剑指Offer----扩展:有趣的数字(腾讯)
问题描述:小Q今天在上厕所时想到了这个问题:有n个数,两两组成二元组,差最小的有多少对呢?差最大呢?输入描述:输入包含多组测试数据。对于每组测试数据:N - 本组测试数据有n个数a1,a2...an - 需要计算的数据保证:1输出描述:对于每组数据,输出两个数,第一个数表示差最小的对数,第二个数表示差最大的对数。输入例子:645 12原创 2016-08-28 16:25:07 · 645 阅读 · 0 评论 -
剑指Offer----扩展:字符移位(腾讯)
问题描述:小Q最近遇到了一个难题:把一个字符串的大写字母放到字符串的后面,各个字符的相对位置不变,且不能申请额外的空间。你能帮帮小Q吗?输入描述:输入数据有多组,每组包含一个字符串s,且保证:1输出描述:对于每组数据,出移位输后的字符串。输入例子:AkleBiCeilD输出例子:kleieilABCD方法一:使用STL库中的stable_pa原创 2016-08-28 13:41:29 · 697 阅读 · 0 评论 -
剑指Offer----扩展:构造回文(腾讯)
问题描述:给定一个字符串s,你可以从中删除一些字符,使得剩下的串是一个回文串。如何删除才能使得回文串最长呢?输出需要删除的字符个数。方法一:将输入的字符串翻转,利用动态规划求两个字符串的最大公共子序列!源代码#include#include#include#include//memory函数using namespace std;原创 2016-08-28 19:32:54 · 705 阅读 · 0 评论 -
剑指Offer----扩展:风口的猪-中国牛市(小米)
问题描述:风口之下,猪都能飞。当今中国股市牛市,真可谓“错过等七年”。 给你一个回顾历史的机会,已知一支股票连续n天的价格走势,以长度为n的整数数组表示,数组中第i个元素(prices[i])代表该股票第i天的股价。 假设你一开始没有股票,但有至多两次买入1股而后卖出1股的机会,并且买入前一定要先保证手上没有股票。若两次交易机会都放弃,收益为0。 设计算法,计算你能获得的最大收益。 输原创 2016-08-28 21:51:01 · 859 阅读 · 0 评论