zoukankan      html  css  js  c++  java
  • 子数组最大值02

    合作过程:

        由于上次作业设计思想不同,经过讨论采用了统一的设计思想。对于这次的作业我们一起进行讨论,我们统一利用二维数组完成一维数组的循环求子数组。我负责进行编码,丽萍负责进行代码的审查和代码的测试。

    设计思想:

    基于上次不循环一维数组求子数组的最大值。

    1.将一维数组转化为二维数组,变相将其转化为循环。即二维数组每一行使一维数组依次向前移动一个数。

    2.利用上次思想一次求出每行子数组的最大值。

    2.1.定义两个数s,max用来更新子数组的最大值,从数组data[]的data[n-1]开始进行求和比较。

    2.2利用for循环,依次判断前几项之和是否小于0,若小于0则从该项继续寻找最大值,并与前几项的最大值进行比较。选出最大值。

    3.比较二维数组每行子数组的最大值的大小,并作比较,将最大值输出。

    遇到的问题:

      一维数组转化为二维数组出现数组越界。

    源代码:

    import java.util.Scanner;
    public class Test{
          static int[][] transform(int data[],int n)
          {//将以为数组转化为二维数组,用来将一维数组变为循环数组
              int d[][]=new int[n][n];
              int j;
              for(j=0;j<n;j++)//第一行保存一维数组
              {
                  d[0][j]=data[j];
              }
              for(int i=1;i<n;i++)//一次前进一个数储存在二维数组下一行
              { 
                  for(j=0;j<n-1;j++)
                  {
                      int t=d[i-1][0];
                      d[i][j]=d[i-1][j+1];
                      d[i][n-1]=t;
                  }    
              }
              return d;
          }
          static int sum(int data[], int n)//定义数组和数组长度
          {
              int s = data[n-1];//s用来更新子数组最大值
              int max = data[n-1];//a表示最大值
              for(int i=n-2;i>=0;i--)//逆序进行
              {
                  if(s<0)//前几项的和为负数,重新计算
                  {
                      s=0;
                  }
                  s=s+data[i];
                  if(s>max)
                  {
                      max=s;//将最大值赋值给a
                  }
              } 
              return max;
          } 
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            Scanner in=new Scanner(System.in);
            System.out.println("请输入数组长度:");
            int n=in.nextInt();
            int array[]=new int[n];
            int twoArray[][]=new int[n][n];
            System.out.println("请输入"+n+"个整数:");
            for(int i=0;i<n;i++)
            {
                array[i]=in.nextInt();
            }
            //转化为二位数组
            twoArray=transform(array,n);
        
            int result[]=new int[n];
            int chucun[]=new int[n];
            for(int i=0;i<n;i++)
            {
                for(int j=0;j<n;j++)
                {
                    //将二维数组每一行储存在一维数组中
                    chucun[j]=twoArray[i][j];                
                }
                //计算每行的子数组最大值
                result[i]=sum(chucun,n);
            }
            //找到result中的最大值
            int max=result[0];
            for(int i=0;i<n-1;i++)
            {
                if(result[i+1]>result[i])
                {
                    max=result[i+1];
                }    
            }
            System.out.print("子数组的最大值为:"+max);
        }
    
        
    
    }

    实验结果截图:

    总结:

    在第一次程序的基础上,只要实现一位数组循环即可。可用二维数组实现一维数组循环。

  • 相关阅读:
    fiddler抓取java系程序的网络通信
    ZOJ 2724 Windows Message Queue(优先队列)
    FZU 电动车通行证制度
    Havel定理
    Catch That Cow
    Trie树
    zoj 2876 Phone List
    zoj 2420
    getchar
    zoj 1315 Excuses, Excuses!
  • 原文地址:https://www.cnblogs.com/java-test/p/5392859.html
Copyright © 2011-2022 走看看