随笔分类 - 编程之美学习笔记
摘要:问题:找出一个有序(字典序)字符串数组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 ...
阅读全文
摘要:题目:编程判断h1、h2两个链表是否相交(为简单起见,假设两个链表不存在环)解法1:将h1的各个节点地址进行hash,建立hash表,在hash表搜索h2的节点地址,若存在,则相交。解法2:若h1,h2相交,那么自相交节点后所有的节点都为这两个链表共享。基于这个特点,直接判断h1、h2两个链表最后节点是否在同一地址即可。解法3:由于两链表本身不存在环,我们可以把第二个链表接在第一个链表后,如果得到的链表有环,则说明这两个链表相交。这样,问题转化为判断变化后的链表是否存在环。(涨姿势了)判断一个链表是否有环地址hash表法:bool a[x]表示地址为x的节点是否已经出现。遍历链表,每遍历一个节
阅读全文
摘要:题目:设计一个算法,把一个含有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个单位,即要
阅读全文
摘要:给定一个长度为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)
阅读全文
摘要:题目:能否快速找出一个数组中的两个数字,让两个数字之和等于一个给定的值,为了简单起见,我们可以假设这个数组中肯定存在至少一组符合要求的解。解法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]+...
阅读全文
摘要:题目:有很多无序的数,怎么选出最大的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.
阅读全文
摘要:题目:Tango是微软亚洲研究院的一个试验项目。研究院的员工和实习生们都很喜欢在Tango上面交流灌水。传说,Tango有一大“水王”,他不但喜欢发贴,还会回复其他ID发的每个帖子。坊间风闻该“水王”发帖数目超过了帖子总数的一半。如果你有一个当前论坛上所有帖子(包括回帖)的列表,其中帖子作者的ID也在表中,你能快速找出这个传说中的Tango水王吗?解法1:排序+遍历。O(nlogn)的时间复杂度。考虑到只需找到数量超过一半的ID,排序有点浪费,可以优化。解法2:分治。将问题的规模逐渐缩小,直到找到答案,时间复杂度O(n)。算法:同时删去2个不同的ID,那么剩下的ID仍然符合"水王ID
阅读全文
摘要:问题: 给玩家4张牌,每张牌的面值在1-13之间,允许其中有数值相同的牌,采用加、减、乘、除四则运算,允许中间运算存在小数,并且可以使用括号,但每张牌只能用一次。构造表达式,使其结果为24。解题思路:穷举、回溯。设数字集合为A,每次从A中任取出2个数,穷举进行4种运算(+,-,*,/),将运算结果放入A中,直到最后A中剩下一个数。用覆盖的方法来剔除取出的2个数,值得学习!!参考书中的代码:#include#include#include#includeusing namespace std;const double bound=1e-6; //浮点数运算存在误差 string str[5];.
阅读全文
摘要:亚洲微软研究院所在的希格玛大厦一共有6部电梯。在高峰时间,每层都有人上下,电梯每层都停。实习生小飞常常会被每层都停的电梯弄的很不耐烦,于是他提出了这样一个办法: 由于楼层并不算太高,那么在繁忙的上下班时间,每次电梯从一层往上走时,我们只允许电梯停在其中的某一层。所有乘客从一楼上电梯,到达某层后,电梯停下来,所有乘客再从这里爬楼梯到自己的目的层。在一楼的时候,每个乘客选择自己的目的层,电梯则计算出应停的楼层。问:电梯停在哪一层楼,能够保证这次乘坐电梯的所有乘客爬楼梯的层数之和最少?解法1:直接枚举暴力解法2:时间可优化到O(n)直觉反应,电梯在前面的状态对后面的状态有影响。粘带效应啊,很多...
阅读全文
摘要:题目:在微软亚洲研究院上班,大家早上来的第一件事是干啥呢?查看邮件?No,是去水房拿饮料:酸奶,豆浆,绿茶、王老吉、咖啡、可口可乐……(当然,还是有很多同事把拿饮料当做第二件事)。管理水房的阿姨们每天都会准备很多的饮料给大家,为了提高服务质量,她们会统计大家对每种饮料的满意度。一段时间后,阿姨们已经有了大批的数据。某天早上,当实习生小飞第一个冲进水房并一次拿了五瓶酸奶、四瓶王老吉、三瓶鲜橙多时,阿姨们逮住了他,要他帮忙。从阿姨们统计的数据中,小飞可以知道大家对每一种饮料的满意度。阿姨们还告诉小飞,STC(Smart Tea Corp.)负责给研究院供应饮料,每天总量为V。STC很神奇,他们提供
阅读全文
摘要:关心数据挖掘和搜索引擎的程序员都知道,我们需要很多的计算机来存储和处理海量数据。然而,计算机难免出现硬件故障而导致网络联系失败或死机。为了保证搜索引擎的服务质量,我们需要保证每份数据都有多个备份。简单起见,假设每个机器存储一个标号为ID的记录(ID是小于十亿的整数),假设每份数据都保存两个备份,这样就有两个机器储存了同样的数据。问: 1.在某个时间,如果得到一个数据文件ID的列表,是否能够快速地找出这个表中仅出现一次的ID? 2.如果已经知道只有一台机器死机(也就是说只有一个备份丢失)呢?如果有两台机器死机呢(假设同一个数据的两个备份不会同时丢失)?解法1:直接哈希,最笨、最实在的方法...
阅读全文

浙公网安备 33010602011771号