google 笔试感悟

感觉很郁闷,考试好像完全不在状态,本来说是7.30考试,却托到了8.30,心里有点紧张,做题的过程中曾有要放弃的想法,最后现在已知的是错了一个选择题, 写程序的题忘记了一个细节地方,在遍历的时候,忘了给遍历过的结点mark,真是不应该。最后一个题没办法,当时硬是没想出来,还是水平问题,总体说来得到了些经验,也算没 白花那100人民币。

说说做错的题吧。

选择: 

 

int  f( int  n)
{
if(n==0)
return 1;
else 
return n*f(n-1)+1;
}

分析f的复杂度,一推很显然是n!,答案里面却没有,搞了好久,硬是没想到n!不是复杂度,而是计算结果,真是晕了,感觉自己在这个递归计算复杂度方面确实是个弱点,后面还有图的遍历的时候,也是没想到其遍历的复杂度是n,总是感觉很大。关键是没有分清计算的过程和复杂度的关系,搞混了,这应该是本次笔试的最大收获了。

最后一个大题:通过修改一些边的权值,使得一个树具有如下性质: 从跟结点到所有叶结点的路径长度都相同,求这个树在变化后所有边的长度的和,不用写代码,分析算法,分析复杂度。

 当时真是头晕,想的很复杂,最后答的一塌糊涂。

正解如下:首先用深度优先遍历,对每一个结点标记一个高度,这个高度就是其叶结点的高度加上其对应边的权值的和的最大的那个。叶结点的高度设置为0。父结点的高度计算依赖其子结点,用深度优先遍历刚好合适,标记完后,遍历树,对每个结点处理如下: 结点下面所有的边修改其权值如下:边长=本结点高度-相应的子结点高度。最后,遍历一次求出边长的和。

一共3次遍历,每次的复杂度是n,所有最后的复杂度也是O(n)。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值