题目:在字符串中找出第一个只出现一次的字符。如果输入“abaccdeff”,则输出'b'解题思路:哈希。num[ch]记录字符ch出现的次数。#includeusing namespace std;int main(){ int num['z'+1]; string s; cin>>s; memset(num,0,sizeof(num)); for(int i=0;s[i]!='\0';i++) num[s[i]]++; for(int i=0;s[i]!='\0';i++) { if(num[s[i]... Read More
posted @ 2013-09-01 15:46 icfnight Views(192) Comments(0) Diggs(0) Edit
题目:输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建新的节点,只能调整树中节点指针的指向。 解题思路:中序遍历就可解决。小->中->大 void doublelist(bTree *p,bTree **tail) //tail 为当前末尾的节点 { if(!p) return ; if(p->left) doublelist(p->left,tail); bTree *cur=p; cur->left=*tail; if(*tail!=NULL) *tail->right=... Read More
posted @ 2013-08-31 14:05 icfnight Views(175) Comments(0) Diggs(0) Edit
题目:输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是,返回true,否则返回false。假设输入的数组任意两个数字都互不相同。解题思路:涉及到二叉树的问题,一般可以这样处理:找到根结点,把该树拆分成左、右子树,继续处理子树,这就变成了一个递归的过程。本题感觉不存在高深的算法,那么可以归结为找规律题,画些草图,不难发现序列的最后一个点即为树的根节点。bool judge(int a[],int len){ if(a==nuLL||len0) left=judge(a,i); bool right=true; if(i<len... Read More
posted @ 2013-08-31 12:08 icfnight Views(236) Comments(0) Diggs(0) Edit
问题:找出一个有序(字典序)字符串数组arr中值等于字符串v的元素的序号,如果有多个元素满足这个条件,则返回序号最大的。分析:取中间值要注意溢出!!mid=(l+r)/2,注意加法运算可能会造成溢出,如果面试官挑剔的话,泪流满面有木有!如果ch[mid]>v,r=mid-1如果ch[mid]v) r=mid-1; else if(ch[mid] int search(int array[], int n, int v){ int left, right, middle; left = 0, right = n; while (left ... Read More
posted @ 2013-08-25 13:45 icfnight Views(286) Comments(0) Diggs(0) Edit
题目:编程判断h1、h2两个链表是否相交(为简单起见,假设两个链表不存在环)解法1:将h1的各个节点地址进行hash,建立hash表,在hash表搜索h2的节点地址,若存在,则相交。解法2:若h1,h2相交,那么自相交节点后所有的节点都为这两个链表共享。基于这个特点,直接判断h1、h2两个链表最后节点是否在同一地址即可。解法3:由于两链表本身不存在环,我们可以把第二个链表接在第一个链表后,如果得到的链表有环,则说明这两个链表相交。这样,问题转化为判断变化后的链表是否存在环。(涨姿势了)判断一个链表是否有环地址hash表法:bool a[x]表示地址为x的节点是否已经出现。遍历链表,每遍历一个节 Read More
posted @ 2013-08-23 18:22 icfnight Views(185) Comments(0) Diggs(0) Edit
题目:设计一个算法,把一个含有N个元素的数组循环右移K位,要求时间复杂度为O(n),且只允许使用两个附加变量。分析:首先,容易忽略K>N的情况,好大一个陷阱啊,有木有TAT。再次,分享下本弱菜的错误思路,错得很经典 = =!WA:不采用一次性连续移动整体的方法,每次只移动有关联的元素。例如第一次移动 temp←a[n]←a[n-k]←a[n-2*k]←a[n-3*k].....最后将temp赋值给最后一个数,貌似是正确的,错在没意识到这些元素是并不一定是首尾相接的(即头元素、尾元素不一定隔着K个单位)!还是学习下书本的神算法吧:假设原数组序列为abcd1234,要求循环右移4个单位,即要 Read More
posted @ 2013-08-12 19:50 icfnight Views(175) Comments(0) Diggs(0) Edit
给定一个长度为N的整数数组,只允许用乘法,不能用除法,计算任意(N-1)个数组合中乘积最大的一组,并写出算法的时间复杂度。解题思路:本题比较能简单。典型的用空间换时间的方法。用A[x]表示a[1]*a[2]*...*a[x],B[x]表示a[x]*a[x+1]*...*a[n]。一次遍历即可。O(n)扩展:若本题可用除法?解题思路:更简单了。A表示所有数的乘积,枚举不选的那个数就行。O(n) Read More
posted @ 2013-08-10 21:47 icfnight Views(132) Comments(0) Diggs(0) Edit
题目:能否快速找出一个数组中的两个数字,让两个数字之和等于一个给定的值,为了简单起见,我们可以假设这个数组中肯定存在至少一组符合要求的解。解法1:巧妙转化,然后二分查找。一般情况下,枚举2个未知数的时间复杂度为O(n^2),我们应该尽可能避免这种情况。枚举一个未知值,然后利用已知的特定条件限制另一个未知值。本题中要求A+B=Y,我们可以枚举A的值,然后在数组中二分查找(Y-A)的值,若成功找到,则为解。时间复杂度为O(nlogn)解法2:先排序,然后设置头尾指针l、r,根据a[l]+a[r]与目标值的大小比较结果,移动指针。 while(r>l) { if(a[l]+... Read More
posted @ 2013-08-10 21:21 icfnight Views(174) Comments(0) Diggs(0) Edit
题目:有很多无序的数,怎么选出最大的K个数?解法1:最简单、最直接--排序!没什么闪光点,而且数目规模大的话,数组装不下,编译不了。解法2:转化为寻找第K大的数(参考《算法设计与分析》中的线性选择算法),然后遍历。解法3:二分答案。设数组中最大的数为vmax,最小的数为vmin。那么,第K大的数必然在[vmin,vmax]中,不断二分这个区间的数值寻找答案。时间复杂度达到O(nlogn),当做拓展思路吧。while(r-l>bound) //可能是浮点数,边界bound是比任意2个数之差还要小的数。{ mid=(l+r)/2; if(calc(a,n,mid)>=k) //cal. Read More
posted @ 2013-08-09 18:03 icfnight Views(327) Comments(0) Diggs(0) Edit
题目:Tango是微软亚洲研究院的一个试验项目。研究院的员工和实习生们都很喜欢在Tango上面交流灌水。传说,Tango有一大“水王”,他不但喜欢发贴,还会回复其他ID发的每个帖子。坊间风闻该“水王”发帖数目超过了帖子总数的一半。如果你有一个当前论坛上所有帖子(包括回帖)的列表,其中帖子作者的ID也在表中,你能快速找出这个传说中的Tango水王吗?解法1:排序+遍历。O(nlogn)的时间复杂度。考虑到只需找到数量超过一半的ID,排序有点浪费,可以优化。解法2:分治。将问题的规模逐渐缩小,直到找到答案,时间复杂度O(n)。算法:同时删去2个不同的ID,那么剩下的ID仍然符合"水王ID Read More
posted @ 2013-08-08 20:19 icfnight Views(191) Comments(0) Diggs(0) Edit