xajh32y 发表于 2015-10-14 07:57:07

九月十月百度人搜,阿里巴巴,腾讯华为小米搜狗笔试面试八十题

9月14日,小米笔试,给一个浮点数序列,取最大乘积子序列的值,例如 -2.5,4,0,3,0.5,8,-1,则取出的最大乘积子序列为3,0.5,8。  点评:
  解法一、
  或许,读者初看此题,自然会想到最大乘积子序列问题类似于最大子数组和问题:http://blog.iyunv.com/v_JULY_v/article/details/6444021,然实则具体处理起来诸多不同,为什么呢,因为乘积子序列中有正有负也还可能有0。
  既如此,我们可以把问题简化成这样:数组中找一个子序列,使得它的乘积最大;同时找一个子序列,使得它的乘积最小(负数的情况)。因为虽然我们只要一个最大积,但由于负数的存在,我们同时找这两个乘积做起来反而方便。也就是说,不但记录最大乘积,也要记录最小乘积。So,
  我们让maxCurrent表示当前最大乘积的candidate,
  minCurrent反之,表示当前最小乘积的candidate。
  (用candidate这个词是因为只是可能成为新一轮的最大/最小乘积),
  而maxProduct则记录到目前为止所有最大乘积candidates的最大值。
  由于空集的乘积定义为1,在搜索数组前,maxCurrent,minCurrent,maxProduct都赋为1。

  假设在任何时刻你已经有了maxCurrent和minCurrent这两个最大/最小乘积的candidates,新读入数组的元素x(i)后,新的最大乘积candidate只可能是maxCurrent或者minCurrent与x(i)的乘积中的较大者,如果x(i)
页: [1]
查看完整版本: 九月十月百度人搜,阿里巴巴,腾讯华为小米搜狗笔试面试八十题