zoukankan      html  css  js  c++  java
  • 求一维数组最大子数组之和(2)

      这是求最大子数组的升级版,虽然算法并没有太大的变化,升级的要求是将每次循环的结果输出一遍,以及将对应的元素位置输出,以及判断了多少个数组。我运用数组块来进行计算的。同时使用输入数据来实现每次停顿,以及输入数字来选择回滚到那一次数据。在回滚操作有两种方法:

      1、在运行一次计算函数,在该循环时输出相应的值。

      2、将相应的循环结果存储在字符串数组中在回滚时,跳转到相应的地方,进行输出。

    这里我选择第一种方法来给出代码:(这个代码的封装性较差,日后我会更改将封装性更好的提供出来)

    //寻找循环数组中的最大子数组,长度已固定long=7;
    package hello;
    
    import java.util.Scanner;
    
    public class App8 {
    
        public static int time=1;
        
        public static void main(String[] args) throws InterruptedException {
            Scanner in= new Scanner(System.in);
            //writeFile();
            int hang=7;
            long sum;
            String str;
            long[] num=new long[hang];            //储存数组块
            long[] num2=new long [hang];        //循环减去第一个的数据,储存每行数据的值
            long max=0;
            int n,s,start=1,end=1;
            boolean f=false;
            sum=in.nextLong();
            num[0]=sum;
            if(sum>0)f=true;
            for( n=1,s=1;n<hang;n++) {                //输入数组,并计算数组块
                sum=in.nextLong();
                if(num[s-1]*sum>0) num[s-1]+=sum;
                else {
                    num[s]=sum;
                    s++;
                }
                if(sum>0)f=true;
            }
            //if(num[0]*num[s]>0) {num[0]+=num[s];num[s]=0;}
            
            if(f==true) {
            max=num[0];
            num2[0]=num[0];
            for(int i=1;i<s;i++) {                    //计算以数组下标为0的各个子数组的和
                num2[i]=num2[i-1]+num[i];
                //if(num2[i]>num2[i-1])max=num2[i];
            }
            for(int i=0,j=0;j<s;) {                    //循环输出最大子数组块以及相应的起始终止位置,和第几次循环
                num2[i]=num2[i]-num[j];
                if(num2[i]>max) {max=num2[i];start=j+2;end=i+1;}
                System.out.println("第  "+time+"  次循环,   已检查  "+time+"  种情况,   当前最大值为"+max+"   当前是第  "+start+"  个元素到第    "+end+"  个元素");
                time++;
                
                if(i==s-1) {j++;i=j;}
                else i++;
                str=in.next();
                if(str.equals("n"))continue;
                else {max=huigun(str,num,s);break;}        //使用再次调用该数组进行回滚操作
            }
            }
            else {                                        //数组中全为负数的算法
                max=num[0];
                num2[0]=num[0];
                for(int i=1;i<s;i++) {
                    num2[i]=num2[i-1]+num[i];
                    if(num2[i]>max)max=num2[i];
                    System.out.println("第"+time+"次循环,还剩下"+time+"种情况,当前最大值为"+max);
                    time++;
                }
            }
            System.out.println("最后结果最大值为"+max);
            in.close();
        }
    
        private static long huigun(String str, long[] num, int s) throws InterruptedException {
            long[] num2=new long [s];
            long max=0;
            int n=Integer.parseInt(str),start=1,end=1;
            max=num[0];
            num2[0]=num[0];
            int time2=1;
            time=n;
            for(int i=1;i<s;i++) {
                num2[i]=num2[i-1]+num[i];
                //if(num2[i]>num2[i-1])max=num2[i];
            }
            for(int i=0,j=0;j<s;) {            
                num2[i]=num2[i]-num[j];
                if(num2[i]>max) {max=num2[i];start=j+1;end=i+1;}
                if(time2>=n) {
                    System.out.println("第  "+time+"  次循环,   已检查  "+time+"  种情况,   当前最大值为"+max+"   当前是第  "+start+"  个元素到第    "+end+"  个元素");
                time++;
                }
                if(i==s-1) {j++;i=j;}
                else i++;
                time2++;
                //Thread.sleep(1000);
                }
            return max;
        }
    
    }

      这次写代码给我个教训,这个教训老师在初次教我们写代码的时候就提醒过:那就是写注释。今天我在我原来的基础上改代码充分地体会到了,不写注释的坏处。需要将代码重新看一遍在进行更改。我记住这次教训了,日后在每次写完程序的时候,要抽出一定的时间将程序的设计思路,以及相应的数字总结下来。

  • 相关阅读:
    Masonry介绍与使用实践:快速上手Autolayout
    OC文件大小的计算方法,多用于清理缓存
    OC接收数据时毫秒转date时间最简略方法
    使用OC语言编写两个超大数相乘或相加的算法的思路和超大正整数相乘的代码
    简述AFN(AFNetWorking 2.X)的实现分析和简单使用【转】
    iOS开发中xib和Storyboard中需要注意的事项
    如何将UISearchBar上"Cancel"按钮改为”取消“?
    iOS开发中关于本地数据中SQLite数据库常用的SQL语句
    UItableViewCell上的button点击无响应的办法
    UIScrollView的几个要点总结
  • 原文地址:https://www.cnblogs.com/huan-ch/p/10770534.html
Copyright © 2011-2022 走看看