zoukankan      html  css  js  c++  java
  • 结对开发之求最大数组溢出问题

    一、要求

    1、题目:

    返回一个整数数组中最大子数组的和。

    2、要求:

    要求程序必须能处理1000 个元素;
    每个元素是int32 类型的;
    输入一个整形数组,数组里有正数也有负数。
    数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
    求所有子数组的和的最大值。要求时间复杂度为O(n)。
    二、设计思路
    1、本题最难的是对于每个元素是int32 类型的,但要防止在运算时产生的数据过大而造成的溢出现象
    2、设置一个临界值,将子数组的和与临界值作比较,如果大于临界值则将此值存放在另一个数组b[]内
    3、存放后使sum=0,重复操作2,最后将b[]内的值输出
    三、代码
     1 package szys;
     2 
     3 import java.util.Random;
     4 import java.util.Scanner;
     5 
     6 public class shuzu {
     7 
     8     public static void main(String[] args) {
     9         // TODO 自动生成的方法存根
    10         
    11         sumN2();
    12         //int sum=MaxSubArraySum.sumN2(array);
    13         //System.out.println("最大的子序列和="+maxSum);
    14     }
    15     public static void sumN2()
    16     {
    17         int M=1073741824;
    18         int m,k;                                      //m为数组内元素的个数
    19         int array[]=new int[10000];
    20         int b[]={0};
    21         
    22         //Random r=new Random();
    23         Scanner n=new Scanner(System.in);
    24         System.out.print("请输入数组内元素的个数:");
    25         m=n.nextInt();
    26         //int s=r.nextInt(100000);
    27         System.out.print("请依次输入数组内元素:");
    28         for(k=0;k<m;k++)
    29         {
    30             array[k]=n.nextInt();
    31         }
    32         System.out.print("数组内元素为:");
    33         for(k=0;k<m;k++)
    34         {
    35             System.out.print(array[k]+",");
    36         }
    37         System.out.println();
    38         int sum=0,maxSum=Integer.MIN_VALUE;
    39         int count=0;
    40         for(int i=0;i<m;i++)
    41         {
    42             sum=0;
    43             for(int j=i;j<m;j++)
    44             {
    45                 sum+=array[j];
    46                 if(sum>maxSum)
    47                 {
    48                     maxSum=sum;
    49                     if(maxSum>M)           //判断大于临界值就存放到数组b中
    50                     {
    51                         b[count]=maxSum;
    52                         count++;
    53                         sum=0;
    54                     }
    55                     
    56                 }
    57             }
    58         }
    59         System.out.print("最大的子序列和="+maxSum);//
    60         for(int i=0;i<=count;i++)          //输出b[]内的值
    61         {
    62             System.out.print(b[count]+" ");
    63         }
    64     }
    65 
    66 }
    四、实验截图
    五、总结
    遗憾的是最终还是没有能够很好地解决数溢出的问题,但在编写的过程中,想了很多解决方案,测试了很多次程序,虽然没有做出来
    但是过程还是很让我感到欣慰的!自己还有许多地方需要学习。
  • 相关阅读:
    176. Second Highest Salary
    175. Combine Two Tables
    172. Factorial Trailing Zeroes
    171. Excel Sheet Column Number
    169. Majority Element
    168. Excel Sheet Column Title
    167. Two Sum II
    160. Intersection of Two Linked Lists
    个人博客记录
    <meta>标签
  • 原文地址:https://www.cnblogs.com/yuji5656/p/4376595.html
Copyright © 2011-2022 走看看