面试笔试
文章平均质量分 64
kay_zhyu
这个作者很懒,什么都没留下…
展开
-
编程之美系列之关于数组的二分查找
有序的数组,其中的元素可以通过二分查找得到,可以如果一个数组是由有序数组左旋得到的,能不能还是用二分查找得到呢?答案是肯定的。为了简化问题,我先假设数组是由升序的数组通过左旋得到了,比如说{1,2,3,4,5,6}=>{4,5,6,1,2,3}。只要我们找到这个最大值的下标,那么就可以把数组分成两个升序的有序数组了。找这个最大值很简单,但是我想你应该不会说全部遍历一遍数组吧!这里讲的重点是二分原创 2013-05-01 15:19:05 · 1757 阅读 · 0 评论 -
面试100题系列之17模拟比赛
题目描述:有n支球队,编号为0~n-1,随机两两比赛,晋级之后同样,求一个Result序列,表明最后每支球队的名次,如果是在同一轮中被淘汰的,那名次相同。其实以前写过这个题的代码,不过现在看看觉得写得太挫了,所以重新写一下。思路分析:这里借用归并排序的思想,其实每次决定两支要比赛的队伍的标号相距多少就可以了,假设队伍i和队伍i+l比赛,不管最后结果怎样,默认胜利的那支球队的编号是存在第i的原创 2013-05-03 13:02:40 · 963 阅读 · 0 评论 -
面试100题系列之15将字符串转换成数
1、输入一个字符串,将其转换成整数。注意,这里没说是正整数,所以需要考虑负数的情况。没什么技巧,直接算就可以了。只要考虑到负数就OK了,当然处理技巧也很重要。核心代码如下://字符串转换成整数int StrToInt(char *str){ if(!str) return -Inf; int nLen = strlen(str); int i = 0; int ans = 0;原创 2013-05-03 10:49:29 · 907 阅读 · 0 评论 -
面试100题系列之14从1到n中随意取几个数,使其和为m
1、题目描述:输入两个整数n和m,从数列1,2,3.......n 中随意取几个数,这里同一个数不能重复取,使其和等于m,要求将其中所有的可能组合列出来。解题思路:典型的0-1背包问题,每一个数字都有两种状态,取或者不取。最简单的就是用递归求解。这里的遍历顺序是从n到1,这样比较好判断递归的出口,当然也比较方便剪枝。核心代码如下,有没有觉得很漂亮://找到1~Num中和等于Sum的所有组合原创 2013-05-03 10:16:36 · 2440 阅读 · 0 评论 -
编程之美系列之求子数组的最大和(续)
在上一篇博客编程之美系列之求子数组的最大和中给出了连续子数组最大和的求法。现在把题目扩展一下,有以下两种情况。PS:转载请注明出处:http://blog.csdn.net/kay_zhyu/article/details/88778261、这个数组是循环的,也就是说数组首尾相连,找出连续子数组的最大和,那这个最大和可能就有一部分在最左边,有一部分在最右边。有两种处理方法:*在数组的后原创 2013-05-02 21:47:01 · 1079 阅读 · 0 评论 -
面试100题系列之16判断序列是不是Pop序列
1、给定两个序列,判断其中一个有没有可能是另一个序列的出栈序列。比如说给定入栈序列为{1,2,3,4,5},出栈序列为{4,5,3,2,1},那后者就是前者的出栈序列。具体步骤是什么呢?出栈操作每次只能出栈顶元素,所以用一个辅助栈来模拟这个出栈操作就可以了。一个元素需要出栈要么是马上要进栈的元素,要么是当前栈顶的元素。如果两者都不是,那就在入栈序列中找到这个元素,然后将这个元素以前的所有元素入栈。原创 2013-05-03 12:04:41 · 722 阅读 · 0 评论 -
编程之美系列之栈和队列2—在O(1)的时间内得到队列的最大或者最小值
上一篇博客http://blog.csdn.net/kay_zhyu/article/details/8869542中提到,在O(1)的时间内取得栈的最大或者最小值,作法是利用一个辅助栈去动态的维护这个最小值。但是如果要在O(1)的时间内取得队列的最小值,那这就有点难办的吧。毕竟队列的操作特点是先进先出,跟栈的完全相反的,我们没办法像栈那要用一个动态的数组去维护这个最小值。怎么办呢?既然栈的最小值原创 2013-04-30 15:00:46 · 3843 阅读 · 3 评论 -
编程之美系列之求子数组的连续最大和
一个有n个整数元素(可以是负数)的一维数组,连续的子数组有很多,那连续的子数组之和的最大值是什么呢?而这个和最大的子数组是哪一段数据呢?下面就让我们来一一的剖析这个问题。首先撇开后面一个问题,不考虑究竟是哪一段数据,只需要求出最大的和就可以了。1、在说思路之前,先看看网上比较流行的解法,到底这里面有什么问题呢?如果数组里面有正数,OK,那一点问题都没有,比如说{-2,5,3,-6,4,-8,6原创 2013-04-30 20:09:41 · 1078 阅读 · 0 评论 -
剑指Offer读书笔记之第二章2字符替换
给定一个字符串str和一个子串SubStr,如果str里面的空间足够,写一个函数将str里面的字符ch替换成SubStr。书中只是一个特例:将空格替换成%20.题目分析:如果从前到后扫描str,碰到一个ch,那么ch后面的所有字符都要向后挪SubLen-1个位置。这样做的效率肯定是不高的,怎么在O(n)的时间复杂度内完成这个操作呢。从前到后扫描不行,那就从后到前扫描。如果预先知道了有多少个原创 2013-05-01 14:21:32 · 800 阅读 · 0 评论 -
编程之美系列之二叉树2—二叉树的距离问题(续)
前面一篇博客:http://blog.csdn.net/kay_zhyu/article/details/8867839讲了二叉树的一些基本的操作,鉴于内容有点多,所以分成两个,这一部分主要是将怎么求给定的两个节点之间的距离。有两种情况:3、如果很频繁的询问两个节点的距离,那么就用一个二维数组来维护这个距离,询问的时间就是O(1).当然,如果只是一次询问,那这样做就很费时。OK,先不管那么原创 2013-04-30 10:31:20 · 1049 阅读 · 0 评论 -
编程之美系列之求子数组的连续最大积
上一篇博客编程之美系列之求子数组的最大乘积讲述了一种求最大乘积的情况,不过那个题相对来说是比较简单的,因为抽象出来之后其实也就是找出需要排除的一个数而已。OK,下面来一个题目的变形,当然这个题目也可以作为编程之美系列之求子数组的连续最大和的扩展。既然需要的子数组是连续的,也就是说是取某一段数据。怎么去决定取哪一段呢?OK,在说思路之前,先说点实际的例子来分析一下。比如说数组{-2,3,4,-3,-原创 2013-05-02 11:29:19 · 1674 阅读 · 6 评论 -
面试100题系列之19二分数组
1、将一个数组的奇数全排在前面,偶数排在后面。(或者偶前奇后是一样的)。还记得快排么?选定一个key,然后将数组分成小于key和大于key的两部分。觉得类似了吧。只是修改一下中间的条件就可以了。核心代码如下:void DivideArray(int *arr, int nLen){ if(!arr || nLen < 1) return; int i = 0; int j原创 2013-05-03 19:58:55 · 670 阅读 · 0 评论 -
面试100题系列之18链表合并
希望看官看完之后,青睐小女子的话,转载就注明一下小女子芳名:http://blog.csdn.net/kay_zhyu/article/details/8880672。码字也不容易是不?1、给定两个有序的链表,假设都是升序的。需要合并两个链表,去除重复的元素,也就是求两个链表的并,这里要求合并之后的结果降序排列。既然有序,那问题就简单多了。OK,轻松加愉快的写出来代码。遍历两个链表,如果链表1原创 2013-05-03 16:11:22 · 1222 阅读 · 0 评论 -
华为2014校园招聘机试题
2013.10.9 上午9:00开始先吐槽一下,学校的机房。我严重怀疑学校机房的VS2010是不是坏的,折腾了半天,一个测试的hello world程序都不能跑。最后,二十多分钟之后,我放弃了,果断选择了VC6.0.虽然很多东西编译不过,但是没办法啊。唉,结果最后人家性格测试都做完了,我才做了1/3。性格测试就不吐槽了。OK,废话不多说了,本来是可以三道题都做完的,结果最后一道题,scan原创 2013-10-09 21:02:27 · 5691 阅读 · 15 评论 -
面试100题之4倒水问题
倒水问题这种智力题经常会问到,总结起来其实其实有三个类型。这几个问题先放在这里,待贫尼一个一个去攻克~~~~1、给两个水杯,容量为v1,v2,问怎么倒出体积为v的水来。水无限量。OK,成功搞定一个。链接:http://blog.csdn.net/kay_zhyu/article/details/87929402、给三个水杯,容量为v1,v2,v3,容量最大的那个水杯的水是满的,怎样倒出原创 2013-04-12 13:05:27 · 5641 阅读 · 0 评论 -
面试100题之21与特定元素交换的排序算法
题目描述:长度为n的数组乱序存放着0至n-1. 现在只能进行0与其他数的swap,请设计并实现排序( 必须采用交换实现)思路分析:任何排序算法都可以,主要就是这里对交换的规则有了规定,只要设计出交换函数,所有的问题就可以迎刃而解了。参考代码:void SpecialSwap(int &a, int &b, int &mid)//特定的交换函数{ if(a == b) retur原创 2013-09-13 21:23:01 · 1023 阅读 · 0 评论 -
程序员面试笔试知识点总结2
1、枚举变量定义:枚举变量的值默认从0开始递增,当设置了某个成员的值时,后面的值在此基础上递增。enum t{a, b, c=3, d, e=6,f};那么a=0, b=1, c=3, d=4, e=6, f=7使用:枚举值是常量,不是变量。不能在程序中用赋值语句再对它赋值。例如对枚举weekday的元素再作以下赋值:sun=5;mon=2;sun=mon; 都是错误的。赋值:只能把枚原创 2013-04-03 19:12:42 · 885 阅读 · 0 评论 -
面试100题之20实现Strstr函数
题目描述:函数原型:char *Strstr(char *pTarget, const char *pPattern),判断pPattern是否是pTarget的一个子串,如果是,返回第一个匹配点的指针,否则返回空。异常处理:若参数中有指针为NULL,返回NULL。如果pPattern是空串,返回整个pTarget。核心代码如下:#include/////实现strstr函数c原创 2013-08-17 19:11:28 · 933 阅读 · 1 评论 -
面试100题系列之13大数的四则运算
关于大数的四则运算,我想网上有很多方法,感觉通用性不强,然后呢,功能不强大,效率不高~~问题多多啊~然后呢,大数这个东西又经常碰到,所以呢,我一咬牙,写了一个比较完整的,花了我一下午的时间啊,不过除法还没有写,有时间再写吧。最近事情太多了,写了之后再补上。OK,说一下我的思路。首先这里用字符串存数据,这个地球人都知道。第0位是高位。当我们算加减的时候需要从低位开始算起。所以我一开始的思路是将字原创 2013-05-02 18:24:47 · 1308 阅读 · 0 评论 -
编程之美系列之寻找最大的K个数
题目描述:有很多无序的数,姑且家丁它们各不相等,怎么选出其中最大的若干个数呢?这里我不想去写一些很没有意义的思路。神马先排序取前k个这种弱爆了并且一点也不适用的思想我就不想废话了,因为如果数据量很大的时候,对所有数据排序肯定是费力不讨好的事情,换换思路,不能全部排序,那就部分排序吧!这里介绍两个比较实用的。当然为了有点递进关系,先来一个比较差一点的方法。如果对排序算法还不是很熟悉的,可以参考博客:原创 2013-05-01 09:39:58 · 966 阅读 · 0 评论 -
剑指Offer读书笔记之第二章3从后往前打印链表
如果给定一个链表,不能改变数据,也就是不能通过反转链表来实现,将链表从后往前打印出来。怎么实现呢?用一个辅助栈,每访问到一个节点的时候,将节点的数据存到栈中,访问完所有的节点之后,将栈中的元素从栈顶打印到栈底。核心代码如下://把节点加到链表中,每次在pHead后面加节点void Add(NODE *pHead, int v){ node[++top].data = v; no原创 2013-05-01 14:50:43 · 1012 阅读 · 1 评论 -
面试100题系列之5字符串的排列组合问题
1、字符串的组合输入一个字符串,找出字符串中所有字符的所有组合形式。比如说abcd,其组合形式有a,b,c,d,ab,ac,ad,bc,bd,cd,abc,abd,acd,bcd,abcd。这里认为adb和abd是一样的情况。组合的情况也就是遇到一个字符,分两种情况,取当前这个字符,或者不取当前这个字符。然后对于每一个字符都做这样的考虑,典型的递归思路。void Range(char原创 2013-04-09 19:29:45 · 1007 阅读 · 0 评论 -
编程之美系列之求子数组的最大乘积
题目描述:给定一个长度为N的整数数组,只允许用乘法,计算任意(N-1)个数的组合中乘积最大的一组,并写出算法的时间复杂度。算法分析:1、二逼青年的做法,把所有可能的(N-1)个数的组合照出来,分别计算它们的乘积,并比较大小。好吧~时间复杂度是O(N^2),这种效率,我连代码都懒得写。2、来点文艺一点的,其实也就是上个月去参加腾讯笔试的一道附加题,我当时就做出来了。具体的看另外一篇博客:原创 2013-05-02 11:04:30 · 1559 阅读 · 0 评论 -
面试100题系列之12判断序列是不是查找二叉树的后序编列
题目描述:判断整数序列是不是二元查找树的后序遍历结果输入一个整数数组,判断该数组是不是某二元查找树的后序遍历的结果。如果是返回true,否则返回false。例如输入5、7、6、9、11、10、8,由于这一整数序列是如下树的后序遍历结果:8/ \6 10/ \ / \5 7 9 11 因此返回true。如果输入7、4、6、5,没有哪棵树的后序遍历的结果是这个序列,原创 2013-05-01 11:06:38 · 1050 阅读 · 0 评论 -
面试100题系列之10关于删除多余空格的再思考
题目描述:1、无连续相邻的两个空格2、字符串开头和结尾无空格3、新的一行开头和结尾无空格要得满分,必须满足一下两个条件A、不能增加新的内存空间B、只能循环字符串一次C、不准用库函数参考代码:这样就可以从文件中读入换行符了#include// 写删除字符串中的空格的程序void main(){ char str[10000]; int flag原创 2013-03-20 17:05:00 · 931 阅读 · 0 评论 -
倒水问题1
思路分析:两个水杯,一大一小,要么用小水杯一直装满水,然后倒入大水杯中,要么一直用大水杯装满水,倒入小水杯中。这里假设每装一次水,则计数一次。最后输入两种方案下装水次数最少的方案。如果是小水杯装水,倒入大水杯中,那么就相当于用小水杯的倍数对大水杯取模,这样就得到一个循环数列。如果目标体积没有出现在这个数列中,说明这种方法不可行。同样如果是大水杯装水,倒入小水杯中,就相当于用大水杯的倍数对小原创 2013-04-12 14:00:36 · 1897 阅读 · 0 评论 -
面试100题系列之6给出洗牌的一个算法,并把洗好的牌放在一个整型的数组里
首先,一副牌有54张,可以与0~53一一对应,所以定义一个数组,用0~53来表示这副牌。洗牌的过程就相当于数组中的元素随机的进行交换。对这54个数,每一个对应的生成一个随机数,然后将当前位置上的数与生成的随机位置上的进行交换就可以了。这样可以随意洗牌了。#include#includevoid shuffle(int *poker){ int temp; int原创 2013-04-09 18:17:10 · 1032 阅读 · 0 评论 -
面试100题系列之3一种关于拆分思路的算法
今天去参加腾讯的笔试,最后一道附加题。两个数组a[N],b[N],其中a[N]的各个元素值已知,现给b[i]赋值,b[i] = a[0]*a[1]*a[2]...*a[N-1]/a[i];要求:1. 不准用除法运算;2. 除了循环计数值,a[N],b[N]外,不准再用其他任何变量(包括局部变量,全局变量等);3. 满足时间复杂度O(n),空间复杂度O(1);我自己的思路:通原创 2013-04-11 12:59:54 · 923 阅读 · 0 评论 -
面试100题系列之2字符串删除多余空格
其实就是删除多余的空格,其实两种方法,一种是在第一个遇到的单词前面加空格,这样的话需要考虑串首的情况。可以用flag来标记是不是句子的第一个单词。另一种方法是在单词结束的字符后面加空格,但需要考虑字符串以空格结尾的情况,遍历完字符串之后,直接判断最后一个元素是不是空格就可以了。第二种方法更直观一点。如果不仅仅是空格,还有回车。参考扩展问题及其再思考。#include#include原创 2013-04-22 21:38:28 · 870 阅读 · 0 评论 -
待解决的问题汇总
1、输出,何解。对#define不熟悉。跪求大神留下解释。#include#define F(a,b) (a)--;(b)++;(a)*(b);int main(){ int i; int a = 3; int b = 4; for(i = 0; i < 5; ++i) F(a,b); printf("a=%d,b=%d", a, b); getchar();}原创 2013-04-20 13:43:46 · 911 阅读 · 3 评论 -
二叉树的遍历
这里为了方便,以二叉查找树为例:#include#include#define M 25struct BST{ int Data; BST *left; BST *right;};BST *stack[M];//栈int flag[M];//后序遍历中需要用到的标记数组bool AddNodeToBST(BST* &Root, int Value)原创 2013-04-05 14:24:42 · 596 阅读 · 0 评论 -
腾讯面试题总结
1.static成员函数的作用是什么?const成员函数的作用是什么?static成员函数的作用1)static成员函数没有this指针,通过使用非static成员显示或隐式地引用this是一个编译时错误。2)static成员函数不是任何对象的组成部分,因而static成员函数不能声明为const。3)static成员函数也不能声明为虚函数。const成员函数的作用1)不能原创 2013-04-24 20:56:03 · 1236 阅读 · 1 评论 -
KMP算法
设模式串(子串)为"p0...pm-1",KMP匹配算法的思想是:当模式串中的字符pj与主串中相应的字符Si不相等时,因其前j个字符("p0...pj-1")已经得到匹配,所以如果"p0...pk-1"="pj-k...pj-1"相同,这是可令pk与Si进行比较,从而使i无须每次都回退到0. 在KMP算法中,依据模式串的next函数值实现子串的滑动。若令next[j] =原创 2013-04-09 19:18:03 · 809 阅读 · 0 评论 -
面试100题系列之1将查找二叉树转换成有序的双向链表
1、将二元查找树转化成排序的双向链表,题目来源:http://blog.csdn.net/v_JULY_v/article/details/605728610/ \6 14/ \ / \4 8 12 16 => 468101216要求:不能创建节点,只改变指针的指向方法:其实就是树的中序遍历。用递归的方法build树,然后再将遍历到的节点一个一个的加到链表中去。#i原创 2013-04-30 13:39:33 · 1069 阅读 · 0 评论 -
面试100题系列之10删除字符串中多余的空格
题目描述:(微软的一道笔试题)1、无连续相邻的两个空格2、字符串开头和结尾无空格3、新的一行开头和结尾无空格要得满分,必须满足一下两个条件A、不能增加新的内存空间B、只能循环字符串一次C、不准用库函数参考代码:#includevoid main(){ char str[10000]; int flag;//用来标记,空格标记为0,新行标记为1,其原创 2013-03-20 09:09:10 · 1335 阅读 · 0 评论 -
编程之美系列之二叉树1—二叉树中的距离问题
先来点基础的,更多扩展,请猛击:http://blog.csdn.net/kay_zhyu/article/details/88689951、首先来个入门级的,求二叉树的深度#include#includestruct NODE{ NODE *Left; NODE *Right;};const int N = 20;NODE node[N];void A原创 2013-04-29 20:45:56 · 992 阅读 · 0 评论 -
找最大的回文
题目:找字符串中的最大回文分析:1、将回文长度从nLen遍历到1;如果找到一个符合条件的回文,那就直接跳出全部循环。这样做的好处就是可以减少不必要的比较。2、如果回文长度记为l,half为l的一半向下取整。i表示中点在源字符串中的位置l为奇数,则每次需要比较buf[i-j]和buf[i+j]是否相等,不相等就跳出循环,因为关于half对称,故j=1~half,i=half~nLen原创 2013-03-24 11:29:53 · 732 阅读 · 0 评论 -
编程之美系列之二叉树的分层遍历
关于二叉树的遍历,大家肯定都不会陌生。当然,这种题目很多人都会做,但是你们心中的解题办法是不是够漂亮呢?首先,这里需要用到的数据结构的队列,这应该没有什么疑问,先进先出嘛。子节点在父节点之后,而用队列,子节点是通过父节点入队列,所以在父节点之后,OK~符合标准!先来说说大致的一些解题思路。1、在NODE的定义中定义一个flag标记,用来记录该节点属于哪一层,然后如果当前节点的层数大于上一个原创 2013-05-01 16:42:39 · 993 阅读 · 0 评论 -
编程之美系列之栈和队列1—在O(1)的时间内得到栈的最大或者最小值
1、定义栈的数据结构,要求添加一个min函数,能够得到栈的最小元素。对于找最大值其实是一个道理,这里就不废话了。要求:函数min、push、pop的时间复杂度都是o(1)这里用一个辅助栈去动态的维护栈的最小值,每次如果有新元素加进来,就和辅助栈的栈顶元素比较,如果新元素较小,把新元素push到辅助栈里面,如果新元素较大,将栈顶的元素拷贝到top+1里面。所以pop的时候直接--top就可以原创 2013-04-30 14:14:30 · 2672 阅读 · 1 评论 -
面试100题系列之8单词反转 VS HDU1062——text reverse
给一个句子,将句子中的单词反转。思路:先将句子整体反转,再将单词一个个进行反转。*如果该字符是空格,前一个字符是单词,那么就在此处反转*如果该字符是单词,其前一个字符是空格,则记录下单词开始的位置特殊情况:句子后面是一串空格,输出的时候可能不想句子前面有空格,所以在反转之前需要先将空格滤去。#include#includechar a[100];void I原创 2013-04-07 18:49:34 · 913 阅读 · 0 评论