
程序员面试题精选100题
zjhhust
这个作者很懒,什么都没留下…
展开
-
程序员面试题100题第13题——第一个只出现一次的字符
题目:在一个字符串中找到第一个只出现一次的字符。分析:此类题型需要建立对应的hash字符数组,空间换时间; 对于指针切记要检查是否为NULL, 对于while循环不要忘记++或--代码:char FindFirstNotRepeatChar(char* pStr){ unsigned int arr[256]={0};//建立对应字符的ha翻译 2012-10-04 21:35:31 · 265 阅读 · 0 评论 -
程序员面试题100题第24题——判断是否是push、pop序列
题目:输入两个字符串(整数或字母),第一个表示为栈的push顺序,判断另外一个是不是对应的pop序列;为简单起见,我们假设push序列的任意两个字符不相等。bool IsPossiblePopOrder(const char* pPush,const char* pPop){ stack stk; const char* p=pPush; co翻译 2012-10-04 21:26:32 · 584 阅读 · 0 评论 -
程序员面试题100题第23题——跳台阶问题
跳台阶问题:实际是一种Fibonacci序列问题Fibonacci序列问题(程序员面试题100题第16题——O(logN)求Fibonacci数列),可以转化为矩阵乘法问题,或者记忆数组问题;代码略。翻译 2012-10-04 21:27:38 · 621 阅读 · 0 评论 -
程序员面试题100题第21题——左旋转字符串
题目:把字符串前n个字符移到字符串的尾部。如:abcdef左旋转2位得到字符串cdefab;分析得:左旋转其实为3个反转操作!代码如下:(主要const的使用)const在*左边修饰指针指向的内容,即内容不能修改const在*右边修饰指针本身,即指针本身不能修改即//左内容右本身char* ReverseString(char * con翻译 2012-10-04 21:29:56 · 527 阅读 · 0 评论 -
程序员面试题100题第28题——全排列
题目:输入一字符串,输出字符串的所有排列分析:我们以三个字符abc为例。首先我们固定第一个字符a,求后面两个字符bc的全排列。当bc的排列求好之后,这就是一部分解;现在我们把第一个字符a和后面的字符b交换得到bac,固定第一个字符b,求后面两个字符ac的全排列。当ac的排列求好之后,这是另外一部分解;接着我们该把c放在第一个位置了,为了确保这次c是和原先处于原创 2012-10-04 21:23:55 · 754 阅读 · 0 评论 -
最大公约数
bool isEven_(int n)//是否是偶数{ return (n&1)==0;}int gcd(int x, int y)//注意递归的基准情况和x,y同为偶数的情况{ if(x<y) { return gcd(y,x); } if(y==0) return x; //以上两步为递归算法中的基准情况!! if(isEven_(x)&&isEven_(y))原创 2012-10-01 16:09:07 · 255 阅读 · 0 评论 -
程序员面试题100题第03题——求子数组的最大和
题目:输入一个整型数组,数组里有整数也有负数。数组中连续的一个或者多个整数组成一个子数组,每个子数组都有一个和。求所有子数组的和的最大值。要求时间复杂度为O(n)。分析:方法一:当我们加上一个正数时和会增加,当我们加上一个负数时,和会减少。如果当前和是个负数,那么这个和在接下来的累加中应该抛弃并重新清零。int FindMaxsumOfSubarray(cons翻译 2012-10-06 15:43:04 · 363 阅读 · 0 评论 -
程序员面试题100题第6题——判断整数序列是不是二元查找树的后序遍历结果
题目:略分析:考虑二元查找树的后序遍历结果最后一位必是根节点,序列的前部分为树的左子树,后部分为右子树,其中左子树上的节点值都小于根节点的值,右子树上的节点值都大于于根节点的值。这样就成了一个 递归的操作。即把序列按照比根节点大小的关系分为左右两个部分,我们递归确认左右两部分是不是二元查找树的后序遍历结果即可。代码:int VertifySque翻译 2012-10-04 21:42:32 · 467 阅读 · 0 评论 -
程序员面试题100题第9题——查找链表中倒数第K个结点
分析:维持两个指针,第一个指针从链表的头指针开始遍历,在第k-1步前,第二个指针保持不动;第k-1步开始,第二个指针也开始一起遍历。这样两个指针之间的距离保持k-1;当第一个指针到达尾结点时,第二个指针正好遍历到倒数第k个结点。代码:略翻译 2012-10-04 21:40:24 · 918 阅读 · 0 评论 -
程序员面试题精选100题(14)-圆圈中最后剩下的数字
题目:n个数字(0,1,…,n-1)形成一个圆圈,从数字0开始,每次从这个圆圈中删除第m个数字(第一个为当前数字本身,第二个为当前数字的下一个数字)。当一个数字删除后,从被删除数字的下一个继续删除第m个数字。求出在这个圆圈中剩下的最后一个数字。分析:既然题目有一个数字圆圈,很自然的想法是我们用一个数据结构来模拟这个圆圈。在常用的数据结构中,我们很容易想到用环形列表。我们可以创建翻译 2012-10-04 21:34:52 · 413 阅读 · 0 评论 -
程序员面试题100题第26题——和为n连续正数序列
题目:输入一个正数n,输出所有和为n连续正数序列。例如输入15,输出1 2 3 4 5、4 5 6、7 8void PrintContinuesSequence(int small, int big){ for(int i=small; i<=big; ++i) cout << i <<" "; cout << endl;}voi翻译 2012-10-04 21:25:41 · 1257 阅读 · 0 评论 -
程序员面试题100题第17题——字符串转化为整数
题目:把输入的字符串转化为整数,如:“-456” 输出456、“+456”输出456,“456”输出“456”,如果是非法输入,则输出0,并提示错误。代码:long long strToNum( const char* pStr){ long long num=0; int flag=1; if(pStr==NULL) { c翻译 2012-10-04 21:32:48 · 365 阅读 · 0 评论 -
程序员面试题100题第18题——两个栈实现队列
题目:两个栈实现队列分析:假设两个栈分别为stk1,stk2;队列的两个操作为入列和出列入列操作:是对栈stk1的入栈操作;出列操作:if stk2为空 { stk1全部出栈,分别顺序入栈到stk2中 }assert( stk2不为空)stk2出栈翻译 2012-10-04 21:32:09 · 399 阅读 · 0 评论 -
程序员面试题100题第12题——从上往下遍历二元树
题目:略分析:即层序遍历二叉树;参考二叉树基本操作翻译 2012-10-04 21:37:45 · 455 阅读 · 0 评论 -
程序员面试题100题第05题——查找最小的K个元素
转自:http://blog.youkuaiyun.com/bingxuewujian/article/details/6089640题目:输入n个整数,输出其中最小的k个。例如输入1,2,3,4,5,6,7和8这8个数字,则最小的4个数字为1,2,3和4。分析:这道题最简单的思路莫过于把输入的n个整数排序,这样排在最前面的k个数就是最小的k个数。只是这种思路的时间复杂度为O(nlog翻译 2012-10-06 15:37:38 · 379 阅读 · 0 评论 -
程序员面试题100题第07题——翻转句子中单词的顺序
题目:输入一个英文句子,反转句子中单词的顺序,但是单词内字符顺序不变。句子中单词以空格符隔开。为简单起见,标点符号和普通字幕一样处理。分析:首先反转句子,再逐个单词反转。代码:注意while循环中对指针的操作;注意const在此处的用处;程序员面试题100题第21题——左旋转字符串char* ReverseString(char * co翻译 2012-10-04 21:41:52 · 391 阅读 · 0 评论 -
程序员面试题100题第19题——反转链表
1、链表相邻元素翻转,如a->b->c->d->e->f-g,翻转后变为:b->a->d->c->f->e->g LNode* ReverseLinkList3(LNode* head){ if(head == NULL) return head; LNode* p; LNode* temp; LNode* trail=head;翻译 2012-10-04 21:31:41 · 790 阅读 · 0 评论 -
程序员面试题100题第16题——O(logN)求Fibonacci数列
题目:定义Fibonacci数列f(1)=0;f(2)=1;...f(n)=f(n-1)+f(n-2);输入n,用最快的方法求该数列的第n项;分析:略代码:struct Matri2By2//定义2*2矩阵{ Matri2By2(unsigned long m00, unsigned long m01,翻译 2012-10-04 21:33:28 · 1139 阅读 · 0 评论 -
程序员面试题100题第22题——整数2进制表示中1的个数
题目:输入一个整数n,求n的2进制表示中1的个数分析可得:n&(n-1)的操作是将n的2进制表示中最右边的1变成0;所以能得到对应的代码:int numOf1(int n){ int count=0; while(n) { count++; n=n&(n-1); } return count;翻译 2012-10-04 21:29:01 · 399 阅读 · 0 评论 -
程序员面试题100题第04题——在二元树中找出和为某一值的所有路径
题目:输入一个整数和一棵二元树。从根结点开始往下访问一直到叶结点所经过的所有结点形成一条路径。打印出和与输入整数相等的所有路径。分析:当访问到某一结点时,把该结点添加到路径上,并累加当前结点的值。如果当前结点为叶结点并且当前路径的和刚好等于输入的整数,则当前的路径符合要求,我们把它打印出来。如果当前结点不是叶结点,则继续访问它的子结点。当前结点访问结束后,递归函数将自动回到父结点。因此翻译 2012-10-06 15:40:51 · 703 阅读 · 0 评论 -
程序员面试题100题第10题——在排序数组中查找和为给定值的两个数
解:从数组两端向数组的中间扫描。代码:略。翻译 2012-10-04 21:38:58 · 777 阅读 · 0 评论 -
程序员面试题100题第11题——求二元查找树的镜像(即交换左右子树)
题目:求二元查找树的镜像(即交换左右子树),递归+迭代分析:其实操作和前序二叉树类似。void Mirror(TreeNode *root)//递归互换左右子树{ if(root == NULL) return ; TreeNode* p=root->leftChild; root->leftChild =root->rightChi翻译 2012-10-04 21:38:24 · 459 阅读 · 0 评论 -
程序员面试题100题第29题——调整数组顺序使奇数位于偶数前面
思想完全是采用快速排序:bool isEven_(int n)//是否是偶数{ return (n&1)==0;}void swapOddEven(int arr[], int left, int right){ int i=left; int j=right; int temp=arr[left]; if(left > right) { return ; }原创 2012-10-01 15:47:55 · 302 阅读 · 0 评论