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

}

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

转载于:https://www.cnblogs.com/huan-ch/p/10770534.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值