1019、最大乘积连续子串解析

来源:互联网 发布:python中文编码问题 编辑:程序博客网 时间:2024/05/01 20:11

地址:http://blog.csdn.net/liuxiaobin_bluegiant/article/details/8707900转载请标明出处,谢谢

欢迎关注微博:http://weibo.com/718667835


最大乘积连续子串问题,确实有点复杂,昨天在庞果网上http://hero.pongo.cn/看见此题(人生做程序首次见到),感觉有点麻烦,介于昨天晚上同一时间发表的一篇文章,代码有些问题,经本人今晚改正,现在代码公布于下,希望大家能够提出宝贵意见,这是主要原因之一,其次见v_JULY_v的文章中,代码不全,且没有java 版的完整代码,在此作一个补充吧。


1019、最大乘积连续子串
返回首页

  • 发布公司:
  • 有 效 期:
  • 庞果网
  • 2013-03-212013-04-20
  • 难 度 等 级:
  • 答 题 时 长:
  • 编程语言要求:
  • 20分钟
  • Java C# VB.NET JavaScript
答题说明

提交代码之前你必须要注意的问题:

  1. 浮点数存在着精度问题,你可以保留两位小数输出;
  2. 你应该判断下输出起点终点的话结果可能是否唯一?如果唯一,如整个序列全是1,你该做何处理?
  3. 请勿从他处复制黏贴代码,一经发现,视作弊处理,永久取消活动参与资格。
悬赏详情
一等奖 : 最新程序员杂志一本 
题目详情

给一个浮点数序列,取最大乘积连续子串的值,例如 -2.5,4,0,3,0.5,8,-1,则取出的最大乘积连续子串为3,0.5,8。也就是说,上述数组中,3 0.5 8这3个数的乘积3*0.5*8=12是最大的,而且是连续的。

 

输入:

输入的第一行为n,表示序列数的个数

输入的第二行是n个浮点数序列

输出:

输出最大乘积子串的起点数,终点数,最大乘积结果值。

 

输入样例:

7

-2.5 4 0 3 0.5 8 -1

输出样例:

3 8 12


解决方案

完整的java code :

import java.text.NumberFormat;import java.util.Scanner;public class    Makamus{     private static double st,ed,Smax=0;     public static void MaxS(double[] arr){double S=1;double tempst = arr[0],temped;double tempstmin=arr[0],tempedmin,tempSmin=1,tempSmax=1,tempstmax=arr[0],tempedmax;for(int i=0;i<arr.length;i++){if(Smax==0&&arr[i]!=0){           Smax=arr[i];tempst=arr[i];tempstmin=arr[i];st=tempst;ed=tempst;}if(arr[i]==0){S=1;                     tempSmin=1;     tempSmax=1;if(i<arr.length-1){tempst=arr[i+1];tempstmin=arr[i+1];}else{tempst=arr[i];tempstmin=arr[i+1];}}else{  S*=arr[i]; tempSmin*=arr[i];  if(tempSmax*arr[i]<tempSmax){ tempSmax=1; if(i<arr.length-1) tempstmax=arr[i+1]; }else{ tempSmax*=arr[i]; }  if(S>Smax){Smax=S;temped=arr[i];st=tempst;ed=temped;}  if(arr[i]>Smax){S=arr[i];   tempst=arr[i];Smax=arr[i];st=tempst;    ed=tempst; }  if(tempSmin>Smax){ Smax=tempSmin; tempedmin=arr[i]; st=tempstmin; ed=tempedmin; } if(tempSmax>Smax){ Smax=tempSmax; tempedmax=arr[i]; st=tempstmax; ed=tempedmax; }  if(tempSmin>arr[i]){ tempSmin=arr[i];       tempstmin=arr[i]; } if(tempSmin>S){ tempSmin=S; }}}}      public static void main(String args[]){Scanner sc=new Scanner(System.in);int N= sc.nextInt();double[] arr=new double[N];for(int i=0;i<N;i++)arr[i]= sc.nextDouble();MaxS(arr);NumberFormat ddf1=NumberFormat.getNumberInstance() ; ddf1.setMaximumFractionDigits(2); System.out.println(ddf1.format(st)+" "+ddf1.format(ed)+" "+ddf1.format(Smax));   }}

解法上没有过多的涉及参数变量,变量个数确定,此点有别于v_JULY_v,同时一个for 语句搞定,在线性时间内完成。由于程序算法清晰,不作过多的解释了。