剑指Offer
HelloWorld_EE
这个作者很懒,什么都没留下…
展开
-
《剑指Offer》面试题:连续子数组的最大和
题目描述: HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学。今天JOBDU测试组开完会后,他又发话了:在古老的一维模式识别中, 常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决。 但是,如果向量中包含负数,是否应该包含某个负数,并期望旁边的正数会弥补它呢?例如:{6,-3,-2,7,-15,1,2,2},连续子向量的最大和为8(从第0个开始,到第3个为止)。你会原创 2015-10-11 21:05:44 · 723 阅读 · 0 评论 -
《剑指Offer》面试题:寻找最小的K个数
题目描述: 输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4。思路:寻找最小的k个数, 首先最容易想到的方法就是对数组中的元素进行排序,然后输出前面的k个数,但是时间复杂度为O(N*logN),因此我们就需要减少时间复杂度 但是,应该如何减少了? 利用partition思想来做,通过快排找到第k个数,然后比他的小的都原创 2015-10-11 18:39:17 · 729 阅读 · 0 评论 -
《剑指Offer》面试题:二叉搜索树转换为双向链表
题目描述: 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。思路 这道题目关键在于不能创建新的节点,如不然,我们可以直接将二叉排序树中序遍历保存到一个数组中,而后再建立一个双性链表,将数据保存到双向链表里。 此题就是中序遍历的一个变种;利用中序遍历递归即可完成,每次递归都保存一个指向已构造好的双向链表的尾节点的指针,将其与下一个原创 2015-10-11 10:59:50 · 667 阅读 · 0 评论 -
《剑指Offer》面试题:从上往下打印出二叉树的每个节点
/* 从上往下打印出二叉树的每个节点,同层节点从左至右打印。 输入: 输入可能包含多个测试样例,输入以EOF结束。 对于每个测试案例,输入的第一行一个整数n(1<=n<=1000, :n代表将要输入的二叉树元素的个数(节点从1开始编号)。接下来一行有n个数字,代表第i个二叉树节点的元素的值。接下来有n行,每行有一个字母Ci。 Ci=’d’表示第i个节点有两子孩子,紧接着是左孩子编号和右孩子原创 2015-09-21 22:05:33 · 832 阅读 · 0 评论 -
《剑指Offer》面试题:实现O(1)获取min的栈
题目 题目描述: 定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数。 除了有push和pop操作外,还有一个min函数返回栈中的最小值, push,pop和min函数的时间复杂度都要为O(1)。思路 push和pop操作很明显就是O(1)的时间复杂度,关键是min函数,一般来说,我们求栈中的最小值,会从栈顶开始遍历栈,并设置一个变量Min来保存每次遍历时的最原创 2015-09-21 19:53:24 · 1350 阅读 · 0 评论 -
《剑指Offer》面试题:按字典序打印出该字符串中字符的所有排列
题目描述: 输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。这道题要注意两个问题: 第一个是重复字母,第二个是按字典顺序。 重复字母我们在进行交换的时候直接跳过就可以了,按字典顺序,这个就需要我们进行排列了。 /*输入:每个测试案例包括1行。输入一个字符串,长度不原创 2015-10-08 22:17:19 · 11288 阅读 · 0 评论 -
《剑指Offer》面试题:栈的压入弹出序列是否匹配
题目 题目描述: 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。 例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。思路:如何来判断一个序列是否为另外一个序列的弹出序列。 判定方法如下: 如果第二个序列中当原创 2015-09-21 20:49:36 · 1793 阅读 · 0 评论 -
《剑指Offer》面试题:三组对面和分别相等的正方体
《剑指Offer》第4章后面的相关题目 题目1 输入一个含有8个数字的数组,判断有么有可能把这8个数字分别放到正方体的8个顶点上,使得正方体上三组相对的面上的4个顶点的和相等。思路 相当于求出8个数字的全排列,判断有没有一个排列符合题目给定的条件,即三组对面上顶点的和相等。而关于寻找全排列与我的这篇博文一样:http://blog.csdn.net/u010412719/article/de原创 2015-10-09 21:30:41 · 1087 阅读 · 1 评论 -
《剑指offer》面试题:顺时针打印矩阵
题目和要求看下面的说明/*题目描述:输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵:1 2 3 45 6 7 89 10 11 1213 14 15 16则依次打印出数字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10.输入:输入可能包含多个测试样例,对于每个测试案例,输入的第一行包括两个整数m和n(1<=m,n<=10原创 2015-09-20 22:00:10 · 826 阅读 · 0 评论 -
《剑指Offer》小结和博文索引
今天是2015年10月17日20:08:23,差不多就算是完成了《剑指Offer》上面的题目了,听说最新版的《剑指Offer》还有部分新添加的题,以后找工作前夕来回顾《剑指Offer》上面的题时再来完成吧。为准备按顺序整理出《剑指Offer》上的题目与其对应的完成的博文,发现还有一些题目居然没有完成也,继续完成吧。还以为完成了,来安排其他的计划的。面试题1:赋值运算符函数 面试题2:实现Singl原创 2015-10-17 21:00:26 · 587 阅读 · 0 评论 -
《剑指Offer》面试题:二叉树的镜像
题目:二叉树的镜像 在完成此题目时,具体的测试要求见下面。先说下完成此题目的感受:刚开始在《剑指Offer》这本书上看到这个题目的时候,感觉这个题目比较简单:就是将二叉树中的非叶子节点的左节点和右节点进行交换即可,但是从编码实现来看,有如下几个问题需要我们额外注意 1)用什么样的数据结构来保存树的节点是需要我们考虑的:采用数组来作为保存二叉树节点的数据结构 2)算法的实现好写,但是测试代原创 2015-09-20 20:01:04 · 614 阅读 · 0 评论 -
《剑指Offer》面试题:字符串的组合(不用递归求解)
剑指offer上的拓展题目 输入一个字符串,输出该字符串的字符的所有组合 比如输入字符串:abc,输出a、b、c、ab、ac、bc、abc。思路 由于需要输出字符串的所有组合情况,在这里不用递归来进行求解。 这里采用另外一个方法来求解,我们开辟一个与字符串等长的int类型的数组,数组中的元素只能非0即1两种情况,当数组中某位的元素为1时,则字符串中对应的那位参与了组合;如果为0原创 2015-10-09 20:26:55 · 823 阅读 · 0 评论 -
《剑指Offer》面试题:八皇后问题
题目:八皇后问题; 即在8 X 8的国际象棋上摆放八个皇后,使其不能相互攻击,即任意两个皇后不得处于同一行,同一列或者同意对角线上,求出所有符合条件的摆法在做了前面两道题之后,解决这道题就容易多了。思想一模一样。全排列解决八皇后问题的思路如下:由于8个皇后不能处在同一行,那么肯定每个皇后占据一行,这样可以定义一个数组arr[8],此数组的下标用来表示皇后所在的列(即数组的下标唯一保证了皇后不同原创 2015-10-09 22:18:54 · 1494 阅读 · 0 评论 -
《剑指Offer》面试题:复制复杂链表
题目描述: 输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),然后进行复制。思路 这里采用了数组的形式来保存链表节点,使得程序有很大的简化,从程序中可以看出,链表中节点中指向下一个节点的指针都没有排上用场。 使用数组来保存链表节点的代码如下/*测试函数的要求输入:输入可能包含多个测试样例,输入以EOF结束。对于每个测试案例,输入的原创 2015-10-08 20:46:10 · 622 阅读 · 0 评论 -
《剑指Offer》面试题:超过数组长度的一半的数
题目描述: 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。 例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。思路 解决此题的思路有很多。 1、最容易想到的方法:将数组进行排序,取中位数即可。但是时间复杂度为O(nlogn)2、考虑用哈希,key保存数组元素,value保存出现的次数,这样在原创 2015-10-11 12:16:14 · 1709 阅读 · 0 评论 -
《剑指Offer》面试题:平衡二叉树
题目 输入一个二叉树的根节点, 判断该树是不是平衡二叉树。如果某二叉树中任意节点的左右子树的深度相差不超过1,那么它就是一棵平衡二叉树。思路: 用后序遍历实现 先遍历节点的左右子树,左右子树都平衡才来判断该节点是否平衡,如果左右子树中有不平衡的,则直接返回false,避免了从上往下逐个节点地计算深度带来的重复遍历节点。#include<stdio.h>#inclu原创 2015-10-11 22:41:18 · 848 阅读 · 0 评论 -
《剑指Offer》面试题:打印出二叉树中结点值的和为输入整数的所有路径
题目描述: 输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。思路 用前序遍历来实现/*测试函数编写的要求如下:输入:每个测试案例包括n+1行:第一行为2个整数n,k(1<=n<=10000),n表示结点的个数,k表示要求的路径和,结点编号从1到n。原创 2015-10-08 19:38:47 · 2315 阅读 · 0 评论 -
《剑指Offer》面试题:重构二叉树
题目描述: 输入某二叉树的前序遍历和中序遍历的结果, 请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。 例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并输出它的后序遍历序列。思路 根据前序遍历的数组,arr[0]为根节点,在中序遍历中找到值等于arr[0]的位置index,则index的左边为此节点原创 2015-10-18 13:48:06 · 1520 阅读 · 1 评论 -
面试题:异或去重
来源:http://blog.csdn.net/ns_code/article/details/27568975异或是一种基于二进制的位运算,用符号XOR或者 ^ 表示,其运算法则是对运算符两侧数的每一个二进制位,同值取0,异值取1。它与布尔运算的区别在于,当运算符两侧均为1时,布尔运算的结果为1,异或运算的结果为0。异或的性质:满足交换律和结合律1、交换律:a^b = b^a;2、结合律:(a^b转载 2015-10-12 20:37:42 · 4204 阅读 · 0 评论 -
《剑指Offer》面试题:约瑟夫环问题
题目描述: 每年六一儿童节,JOBDU都会准备一些小礼物去看望孤儿院的小朋友,今年亦是如此。 HF作为JOBDU的资深元老,自然也准备了一些小游戏。其中,有个游戏是这样的:首先,让小朋友们围成一个大圈。 然后,他随机指定一个数m,让编号为1的小朋友开始报数。每次喊到m的那个小朋友要出列唱首歌,然后可以在礼品箱中任意的挑选礼物, 并且不再回到圈中,从他的下一个小朋友开始,继续1…原创 2015-10-14 20:59:34 · 1234 阅读 · 0 评论 -
《剑指Offer》面试题:不使用加减乘除做加法运算
题目描述: 写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。思路:分三步 1、先将各bit位相加sum,不计进位,这一步可以用m^n实现 2、计算进位,进位如何来,用m&n可以得到m和n中都为1的bit位,而不全为1的位则全部变为了0,该位相加会发生进位,使得左边一位加1,因此(m&n)<<1便可得到进位的数carry; 3、将前面两步的结果相加即(sum、c原创 2015-10-15 20:53:36 · 990 阅读 · 0 评论 -
《剑指Offer》面试题:把数组排成最小的数和qsort函数的一点介绍
题目描述: 输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。思路 先将数组中的数字转化为字符串,然后将其进行排序,’n’、’m’排序的规则是 看组合“mn”和“nm”谁大,如前者大于后者,则’m’>’n’ 例如:’321’和’31’ 的结果就是:’32131’>原创 2015-10-15 22:14:25 · 734 阅读 · 0 评论 -
《剑指Offer》面试题:1+2+3+...+n
题目描述: 求1+2+3+…+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。思路: 每个人对这个题目都比较熟悉,也都会求解。每个人能够想到的方法有 1)递归 2)循环累加求和。 3)直接用等差数列求和公式 但是,由于题目限制了,不能 使用乘除法、循环等要求,因此不能使用上面的方法。 虽然这个题目看起来很简单,但原创 2015-10-15 20:04:13 · 1228 阅读 · 0 评论 -
《剑指Offer》面试题:寻找的连续序列的和等于某一定值
题目描述: 小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100。 但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数)。 没多久,他就得到另一组连续正数和为100的序列:18,19,20,21,22。现在把问题交给你,你能不能也很快的找出所有和为S的连续正数序列? Good Luck!思路一:暴力搜索法。 即原创 2015-10-13 22:13:23 · 1925 阅读 · 0 评论 -
《剑指Offer》面试题:找出数组中有3个出现一次的数字
题目 一个int数组中有三个数字a、b、c只出现一次,其他数字都出现了两次。请找出三个只出现一次的数字。思路 由于3个数字出现一次,其他数字均出现两次,因此可以得到n一定为奇数。 3个只出现一次的数字,他们的bit位肯定不可能全部相同,也就是说,虽然有些bit位上的数可能相等,但肯定至少存在某一个bit位,这三个数中,有两个数的该bit位为1,一个数的该bit位为0,或者两个数的该bit位原创 2015-10-13 21:09:24 · 3523 阅读 · 0 评论 -
《剑指Offer》面试题:扑克牌的顺子
题目描述 LL今天心情特别好,因为他去买了一副扑克牌,发现里面居然有2个大王,2个小王(一副牌原本是54张^_^)…他随机从中抽出了5张牌,想测测自己的手气,看看能不能抽到顺子, 如果抽到的话,他决定去买体育彩票,嘿嘿!!“红心A,黑桃3,小王,大王,方片5”,“Oh My God!”不是顺子…..LL不高兴了, 他想了想,决定大\小 王可以看成任何数字,并且A看作1,J为11,Q为原创 2015-10-14 20:13:26 · 731 阅读 · 0 评论 -
《剑指Offer》面试题:数组中只出现一次的数字
题目描述: 一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。思路 根据异或去重的原理,我们知道如果只有一个只出现一次的数字的求法,但这里是有两个只出现一次的数字,我们便要想办法把他分为两个子数组,每个子数组中包含一个只出现一次的数字,其他的数字都出现了两次。剑指offer上的思路很巧妙,依然从头到尾异或所有的数字,这样得到的结果实际上就是两个只出现了原创 2015-10-12 21:35:32 · 1614 阅读 · 0 评论 -
《剑指Offer》面试题:从上往下打印出二叉树的每个节点
/* 从上往下打印出二叉树的每个节点,同层节点从左至右打印。 输入: 输入可能包含多个测试样例,输入以EOF结束。 对于每个测试案例,输入的第一行一个整数n(1<=n<=1000, :n代表将要输入的二叉树元素的个数(节点从1开始编号)。接下来一行有n个数字,代表第i个二叉树节点的元素的值。接下来有n行,每行有一个字母Ci。 Ci=’d’表示第i个节点有两子孩子,紧接着是左孩子编号和右孩子原创 2015-09-21 21:58:47 · 1279 阅读 · 0 评论 -
《剑指Offer》面试题:二叉树的深度
题目描述: 输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。思路 此题的递归思想比较简单,直接用递归将根节点的深度转换为求左右子孩子的深度的较大值+1,根节点的深度等于max(左孩子的深度,右孩子的深度)。 /*输入:第一行输入有n,n表示结点数,结点号从1到n。根结点为1。 n <= 10。接下来有n行,每行有原创 2015-10-12 19:42:17 · 758 阅读 · 0 评论 -
《剑指Offer》面试题:寻找两个链表的第一个公共节点
题目 输入两个链表,找出它们的第一个公共结点。思路 画图会发现如果二者有公共结点,则公共节点后面的节点也都是公共节点。用两个辅助栈,将两个链表从头分别压入栈,最后二者出栈,最后一个相同的出栈元素即为公共节点。 但以上这样需要开辟两个栈的空间,实际上,如果用两个数组来保存链表结点就可以不用开辟空间,分别求出二者的长度,求出二者的差dis, 而后将指向长的链表的指针原创 2015-10-07 11:48:18 · 846 阅读 · 0 评论 -
《剑指Offer》面试题:判读数组是否是某二叉搜索树的后序遍历
题目描述: 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。思路 /* 注意两点 1)二叉搜索树的特点: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 2)而后续遍历是根据 “左右根节点”的顺原创 2015-10-07 10:30:49 · 595 阅读 · 0 评论 -
《剑指Offer》面试题:丑数
题目 题目描述: 把只包含因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。 输入: 输入包括一个整数N(1<=N<=1500)。 输出: 可能有多组测试数据,对于每组数据, 输出第N个丑数。 样例输入: 3 样例输出原创 2015-09-09 22:28:01 · 1277 阅读 · 0 评论 -
《剑指Offer》面试题:数值的整数次方
题目 面试题11:数值的整数次方 题目:实现函数double Power(double base,int exponent), 求base的exponent次方,不得使用库函数,同时不需要考虑大数问题/*面试题11:数值的整数次方 题目:实现函数double Power(double base,int exponent), 求base的exponent次方,不得使用库函数原创 2015-08-31 20:34:26 · 916 阅读 · 0 评论 -
《剑指Offer》面试题:替换空格
题目 //题目:请实现一个函数,吧字符串中的每个空格替换成“%20”。例如输入“We are happy”,则输出”We%20are%20happy“。#include<stdio.h>#include<string.h>//题目:请实现一个函数,吧字符串中的每个空格替换成“%20”。例如输入“We are happy”,则输出”We%20are%20happy“。//将空格用“%20”原创 2015-08-30 12:41:26 · 773 阅读 · 0 评论 -
《剑指Offer》面试题:将字符串转换为整数
题目 题目:把字符串转化为整数 ,若输入无效,则返回0且将标志位设为true自己以前在一些书上面看到过关于 字符串转化为整数的例子,心中有点印象,知道要考虑一些特殊情况。今天决定写下这段代码,发现代码写的稀烂,重复度太大,需要改善。刚实现的代码如下:/*题目:把字符串转化为整数 ,若输入无效,则返回0且将标志位设为true; 需要考虑的测试用例如下:1)"123"2)"+123" /原创 2015-08-30 20:02:32 · 3376 阅读 · 0 评论 -
《剑指Offer》面试题:从尾到头打印链表
题目 输入一个链表的头结点,从尾到头反过来打印出每个结点的值法一思路:将链表的指针全部反向,然后输出即可/*题目:输入一个链表的头结点,从尾到头反过来打印出每个结点的值 思路:将链表的指针全部反向,然后输出即可 */#include<stdio.h>#include<string.h>#include <stdlib.h> typedef int ElementType;str原创 2015-08-30 16:49:37 · 931 阅读 · 0 评论 -
《剑指Offer》:移除字符串中重复的字符
题目: 移除字符串中重复的字符, 如abcadc移除后变为abcd, 注意:可以额外定义一两个变量,但不允许额外开辟一个数组。思路 这里要求了空间复杂度为O(1),那我们只能用最简单的遍历方法,先让第一个字符与后面的字符一一比较,遇到重复的就把重复的字符用’\0’替换掉,再让第二个字符与右面的字符一一比较,遇到重复的,就把重复的字符用’\0’代替,如此循环,直到最后一个字符,当原创 2015-08-29 13:04:40 · 884 阅读 · 0 评论 -
《剑指Offer》:删除在另一个字符串中出现的字符
题目 题目:输入两个字符串,从第一字符串中删除第二个字符串中所有的字符。 例如,输入”They are students.”和”aeiou”,则删除之后的第一个字符串变成”Thy r stdnts.”。思路 利用两层for循环依次根据第二个字符串中出现的字符将第一个字符串中的同样的字符替换为 ‘\0’,然后将后面的字符移到前面即可;/* 题目:输入两个字符串,从第一字符串中删原创 2015-08-29 14:36:55 · 968 阅读 · 0 评论 -
《剑指Offer》面试题:二维数组中的查找
题目 题目:在一个二维数组中,每一行都按照从左到右的顺序进行了排序,每一列都按照从上到下进行了排序。 输入这样的一个二维数组arr和一个整数k,判断数组中是否存在这个数。思路 由于数组时有序的这样一个前提,因此 从右上角开始查找 :如果要查找的数比右上角的值大,则查找范围删除掉(并不是实际的删除,只需要改变下标即可)这一行,如果要查找的数比右上角的值小,则查找范围删除掉这一列;原创 2015-08-30 14:26:31 · 920 阅读 · 1 评论 -
《剑指Offer》:移除字符串中重复的字符_2
题目 移除字符串中重复的字符,字符串由小写字母构成 如abcadc移除后变为abcd, 要求:时间复杂度尽可能小与上篇博文(http://blog.csdn.net/u010412719/article/details/48086641)不一样的地方是:虽然都是移除字符串中重读的字符,但是这里的要求是时间复杂度尽可能小,对空间没有要求。思路 思路:要求时间复杂度尽可能小而对空原创 2015-08-29 13:44:02 · 766 阅读 · 0 评论