• 求一维数组最大子数组之和(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;
        }
    
    }

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

  • 相关阅读:
    深度优先搜索初尝试-DFS-LakeCounting POJ No.2386
    hdoj-2053-Switch Game
    《算法竞赛入门经典》习题及反思 -<2>
    高精度N的阶乘-N!
    列举一些有所帮助的blog和文章
    hdoj-2039-三角形
    hdoj-2035-人见人爱a^b
    hdoj-2028-Lowest common multiple plus
    hdoj上的一题和程序设计第二次作业的拓展-人见人爱a+b
    程序设计第三次作业---C++计算器雏形
  • 原文地址:https://www.cnblogs.com/huan-ch/p/10770534.html
Copyright © 2020-2023  润新知