zoukankan      html  css  js  c++  java
  • 返回一个整数数组中最大子数组的和——课堂测试

    题目:

     代码如下:

    package day01;
    
    import java.util.Scanner;
    
    public class MaxArray {    
    
        public static int max(int i,int j) {
            int m;
            if(i>j)
                m=i;
            else 
                m=j;
            return m;        
        }
        public static void main(String[] args) {
            // TODO 自动生成的方法存根
    
             int i,n;
             
             int[] a = new int[100];
             Scanner sc = new Scanner(System.in);   //n个整数
             n=sc.nextInt();
             for(i=1;i<=n;i++)
             a[i]=sc.nextInt();
              for(i=2;i<=n;i++)
              {
                  if(a[i]+a[i-1]>a[i])         //如果这个数加上前面数之和大于这个数,那么这就是一个连续的子数组
                  a[i]=a[i]+a[i-1];
              }
                int ans=-100000;
                for(i=1;i<=n;i++)
                    ans=max(ans,a[i]);      //先把第一个子数组和赋值给ans,在与下一个子数组和比较哪个更大,将大的刷新赋给ans,依次循环
            System.out.println(ans);
            sc.close();
        }
    
    }

     测试结果截图:

     

     拓展:如数组为环型数组,求数组中最大子数组的和

    要求:每个值只能取一次

    代码如下:

    package day01;
    
    import java.util.Scanner;
    
    public class FindMaxArray {
    
        public static void main(String[] args) {
            // TODO 自动生成的方法存根
            int length;//定义数组长度length
            int n;//定义变化后的数组的长度
            System.out.println("请输入数组元素个数");
            Scanner sc = new Scanner(System.in);
            length=sc.nextInt();
            n=2*length;
            
            int[] a = new int[n];
            System.out.println("请输入数组中的元素:");
           
            for(int i=0;i<length;i++)
            {    
                 a[i] = sc.nextInt();
            }
            int max=a[0];
            int s=0;//定义求和后的元素
            for(int i=0;i<length;i++)
             {
               s=0;
               for(int j=i;j<length+i;j++)
               {
                  s=s+a[j];
                  if(s>max)
                  {
                     max=s;
                  }
               }
              a[length+i]=a[i];                                //每次将已经计算过的数放到最后
             }
            System.out.println("最大子数组的和为:"+max);
            sc.close();
        
    
        }
    
    }

     但是上面的解决方法与要求不服,数组中的值用了两次,及每次第i个值昨完判断后再赋值给length+i。所以现在还没有想到别的方法。

  • 相关阅读:
    记录第一次阿里云服务器部署java web工程的经历
    常用网站……
    根据ID获取CEdit的句柄实例
    (转)MFC中获得各个类的指针/句柄 ID的总结
    (转)DoDataExchange执行时机
    深入浅出Visual_C动态链接库(Dll)编程(宋宝华)----整理(word)
    (转)MFC的一些宏的整理 (DECLARE_DYNCREATE/IMPLEMENT_DYNCREATE)
    Socket 学习入门
    (转) 新的开始之Win7、CentOS 6.4 双系统 硬盘安装
    WIN7下使用VC2010调试uCOS-II 2.91
  • 原文地址:https://www.cnblogs.com/tianwenjing123-456/p/12363637.html
Copyright © 2011-2022 走看看