全球旧事资料 分类
个例子演示上述代码的运行过程:步骤数据栈辅助栈1push3302push434003push23420024push1342100235pop3420026pop34007push0340002
最小值3321230
讨论:如果思路正确,编写上述代码不是一件很难的事情。但如果能注意一些细节无疑能在面试中加分。比如我在上面的代码中做了如下的工作:用模板类实现。如果别人的元素类型只是i
t类型,模板将能给面试官带来好印象;两个版本的top函数。在很多类中,都需要提供co
st和非co
st版本的成员访问函数;mi
函数中assert。把代码写的尽量安全是每个软件公司对程序员的要求;添加一些注释。注释既能提高代码的可读性,又能增加代码量,何乐而不为?总之,在面试时如果时间允许,尽量把代码写的漂亮一些。说不定代码中的几个小亮点就能让自己轻松拿到心仪的Offer。
03-求子数组的最大和
题目:输入一个整形数组,数组里有正数也有负数。数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。求所有子数组的和的最大值。要求时间复杂度为O
。例如输入的数组为123104725,和最大的子数组为310472,因此输出为该子数组的和18。分析:本题最初为2005年浙江大学计算机系的考研题的最后一道程序设计题,在2006年里包括google在内的很多知名公司都把本题当作面试题。由于本题在网络中广为流传,本题也顺利成为2006年程序员面试题中经典中的经典。如果不考虑时间复杂度,我们可以枚举出所有子数组并求出他们的和。不过非常遗憾的是,由于长度为
的数组有O
2个子数组;而且求一个长度为
的数组的和的时间复杂度为O
。因此这种思路的时间是O
3。很容易理解,当我们加上一个正数时,和会增加;当我们加上一个负数时,和会减少。如果当前得到的和是个负数,那么这个和在接下来的累加中应该抛弃并重新清零,不然的话这个负数将会减少接下来的和。基于这样的思路,我们可以写出如下代码。参考代码:
Fi
dthegreatestsumofallsubarraysRetur
valueifthei
putisvalidretur
trueotherwiseretur
false
fboolFi
dGreatestSumOfSubArrayi
tpDatai
t
GreatestSumifthei
putisi
validretur
falseifpDataNULL
Le
gth0retur
falsei
t
CurSum
GreatestSum0foru
sig
edi
ti0i
Le
gthi
CurSumpDataiifthecurre
tsumis
egativediscarditif
CurSum0
CurSum0ifagreatersumr
好听全球资料 返回顶部