随笔分类 - 程序员面试精选100题
摘要:题目:输入一个整型数组,数组里有整数也有负数。数组中连续的一个或者多个整数组成一个子数组,每个子数组都有一个和。求所有子数组的和的最大值。要求时间复杂度为O(n)。分析:方法一:当我们加上一个正数时和会增加,当我们加上一个负数时,和会减少。如果当前和是个负数,那么这个和在接下来的累加中应该抛弃并重新清零。int FindMaxsumOfSubarray(const vector<int>& vec){ int sum=0; int MaxSum=0; for(vector<int>::size_type i=0; i<vec.size(); i++) {
阅读全文
摘要:题目:输入一个整数和一棵二元树。从根结点开始往下访问一直到叶结点所经过的所有结点形成一条路径。打印出和与输入整数相等的所有路径。分析:当访问到某一结点时,把该结点添加到路径上,并累加当前结点的值。如果当前结点为叶结点并且当前路径的和刚好等于输入的整数,则当前的路径符合要求,我们把它打印出来。如果当前结点不是叶结点,则继续访问它的子结点。当前结点访问结束后,递归函数将自动回到父结点。因此我们在函数退出之前要在路径上删除当前结点并减去当前结点的值,以确保返回父结点时路径刚好是根结点到父结点的路径。我们不难看出保存路径的数据结构实际上是一个栈结构,因为路径要与递归调用状态一致,而递归调用本质就是一个
阅读全文
摘要:转自:http://blog.csdn.net/bingxuewujian/article/details/6089640题目:输入n个整数,输出其中最小的k个。例如输入1,2,3,4,5,6,7和8这8个数字,则最小的4个数字为1,2,3和4。分析:这道题最简单的思路莫过于把输入的n个整数排序,这样排在最前面的k个数就是最小的k个数。只是这种思路的时间复杂度为O(nlogn)。我们试着寻找更快的解决思路。我们可以开辟一个长度为k的数组。每次从输入的n个整数中读入一个数。如果数组中已经插入的元素少于k个,则将读入的整数直接放到数组中。否则长度为k的数组已经满了,不能再往数组里插入元素,只能替换
阅读全文
摘要:题目:略分析:考虑二元查找树的后序遍历结果最后一位必是根节点,序列的前部分为树的左子树,后部分为右子树,其中左子树上的节点值都小于根节点的值,右子树上的节点值都大于于根节点的值。这样就成了一个 递归的操作。即把序列按照比根节点大小的关系分为左右两个部分,我们递归确认左右两部分是不是二元查找树的后序遍历结果即可。代码:int VertifySquenceOfBst(element list[], int length){ if(list ==NULL || length<=0) { return 0; } int i=0; int j=0; el...
阅读全文
摘要:题目:输入一个英文句子,反转句子中单词的顺序,但是单词内字符顺序不变。句子中单词以空格符隔开。为简单起见,标点符号和普通字幕一样处理。分析:首先反转句子,再逐个单词反转。代码:注意while循环中对指针的操作;注意const在此处的用处;程序员面试题100题第21题——左旋转字符串char* ReverseString(char * const pStart, char * const pEnd)//反转字符串{ char *pS=pStart; char *pE=pEnd; if(pS != NULL && pE != NULL) { char temp...
阅读全文
摘要:分析:维持两个指针,第一个指针从链表的头指针开始遍历,在第k-1步前,第二个指针保持不动;第k-1步开始,第二个指针也开始一起遍历。这样两个指针之间的距离保持k-1;当第一个指针到达尾结点时,第二个指针正好遍历到倒数第k个结点。代码:略
阅读全文
摘要:解:从数组两端向数组的中间扫描。代码:略。
阅读全文
摘要:题目:求二元查找树的镜像(即交换左右子树),递归+迭代分析:其实操作和前序二叉树类似。void Mirror(TreeNode *root)//递归互换左右子树{ if(root == NULL) return ; TreeNode* p=root->leftChild; root->leftChild =root->rightChild; root->rightChild=p; //swap if(root->leftChild != NULL) Mirror(root->leftChild); if(root->righ...
阅读全文
摘要:题目:略分析:即层序遍历二叉树;参考二叉树的基本操作
阅读全文
摘要:题目:n个数字(0,1,…,n-1)形成一个圆圈,从数字0开始,每次从这个圆圈中删除第m个数字(第一个为当前数字本身,第二个为当前数字的下一个数字)。当一个数字删除后,从被删除数字的下一个继续删除第m个数字。求出在这个圆圈中剩下的最后一个数字。分析:既然题目有一个数字圆圈,很自然的想法是我们用一个数据结构来模拟这个圆圈。在常用的数据结构中,我们很容易想到用环形列表。我们可以创建一个总共有m个数字的环形列表,然后每次从这个列表中删除第m个元素。在参考代码中,我们用STL中std::list来模拟这个环形列表。由于list并不是一个环形的结构,因此每次跌代器扫描到列表末尾的时候,要记得把跌代器移到
阅读全文
摘要:题目:定义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, unsigned long m10, unsigned long m11):m_00(m00),m_01(m01),m_10(m10),m_11(m11) {};//结构体的构造函数 unsigned long m_00; un...
阅读全文
摘要:题目:把输入的字符串转化为整数,如:“-456” 输出456、“+456”输出456,“456”输出“456”,如果是非法输入,则输出0,并提示错误。代码:long long strToNum( const char* pStr){ long long num=0; int flag=1; if(pStr==NULL) { cout << "is null!\n"; return 0; } if(*pStr=='-') { flag=-1; pStr++; }else if(...
阅读全文
摘要:题目:两个栈实现队列分析:假设两个栈分别为stk1,stk2;队列的两个操作为入列和出列入列操作:是对栈stk1的入栈操作;出列操作:if stk2为空 { stk1全部出栈,分别顺序入栈到stk2中 }assert(stk2不为空)stk2出栈
阅读全文
摘要:1 、链表相邻元素翻转2 、题目:输入一个链表的头结点,反转该链表,返回反转后链表的头结点;LNode* ReverseLinkList(LNode* head)//带头结点{ if(head == NULL)//注意 return head; LNode* p=head->next; LNode* temp=NULL; LNode* trail=NULL; while(p != NULL) { //4句 temp=p; p=p->next; temp->next=trail; tra...
阅读全文
摘要:题目:把字符串前n个字符移到字符串的尾部。如:abcdef左旋转2位得到字符串cdefab;分析得:左旋转其实为3个反转操作!代码如下:(主要const的使用)const在*左边修饰指针指向的内容,即内容不能修改const在*右边修饰指针本身,即指针本身不能修改即//左内容右本身char* ReverseString(char * const pStart, char * const pEnd)//反转字符串{//const不修改指针 //左内容右本身 char *pS=pStart; char *pE=pEnd; if(pS != NULL && pE != NULL) ..
阅读全文
摘要:题目:输入一个整数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;}同理判断n是不是2的整数次幂return !(n&(n-1));
阅读全文
摘要:跳台阶问题:实际是一种Fibonacci序列问题Fibonacci序列问题(程序员面试题100题第16题——O(logN)求Fibonacci数列),可以转化为矩阵乘法问题,或者记忆数组问题;代码略。
阅读全文
摘要:题目:输入两个字符串(整数或字母),第一个表示为栈的push顺序,判断另外一个是不是对应的pop序列;为简单起见,我们假设push序列的任意两个字符不相等。代码:bool IsPossiblePopOrder(const char* pPush,const char* pPop){ stack<char> stk; const char* p=pPush; const char* q=pPop; if(strlen(p) != strlen(q)) { return false; } while( *p!='\0') { ...
阅读全文
摘要:题目:输入一个正数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;}void FindContinuesSequence(int n){ if (n<3) return; int small=1; int big=2; int middle=(1+n)/2;//用于判断结束
阅读全文
摘要:题目:输入一字符串,输出字符串的所有排列分析:我们以三个字符abc为例。首先我们固定第一个字符a,求后面两个字符bc的全排列。当bc的排列求好之后,这就是一部分解;现在我们把第一个字符a和后面的字符b交换得到bac,固定第一个字符b,求后面两个字符ac的全排列。当ac的排列求好之后,这是另外一部分解;接着我们该把c放在第一个位置了,为了确保这次c是和原先处于第一位置的a交换,必须把b和a交换回来,得到abc,然后再把c交换到第一位置得到cba,固定第一个字符c,求后面两个字符ba的全排列。当ba的排列求好之后,这是另外一部分解;三部分解组成所有的解。又如abcdabcda{bcd的排列}//得
阅读全文

浙公网安备 33010602011771号