关于返回一个整数数组中最大子数组的和的问题(续02)
增添的新要求:
1、一维数组变为收尾相连的循环数组。
(其他要求与上篇博客一致)
设原本的数组为:
0 | -1 | -2 | -3 | 5 |
变为循环数组后,0与5相连,但是最大子数组的长度一定小于等于数组长度5,所以将除最后一个数外的数,存放到最后一个数后面,
变化后的数组:
0 | -1 | -2 | -3 | 5 | 0 | -1 | -2 | -3 |
按照续01的要求,添加上最大子数组的长度不能大于原数组长度的判断条件,就可求出结果
package about_bank_account; import java.io.BufferedReader; import java.io.File; import java.io.FileReader; import java.io.IOException; import java.math.BigInteger; public class Test { @SuppressWarnings("resource") public static void main (String[] args) throws IOException{ String line = null; String snum[] = new String[100]; String sp[] = null; File file = new File("Number.txt"); BufferedReader br = new BufferedReader(new FileReader(file)); int temp = 0; int k = 0; int i = 0; BigInteger big[] = new BigInteger[100]; BigInteger bigrmax = new BigInteger("0"); BigInteger bigmax = new BigInteger("0"); int jianceshu = 0; //读文件 while((line=br.readLine())!=null) { sp = line.split(" ");//按空格进行分割 for(i=0;i<sp.length;i++){ snum[temp] = sp[i]; temp++; } } //检测文件中异常 try { for(i = 0; i<snum.length; i++) {//转化为大数 if(snum[i] != null) { big[i] = new BigInteger(snum[i]); //System.out.println(big[i]); } } } catch(NumberFormatException e) { System.out.println("文件中存在异常字符!"); jianceshu = 1; } //若无异常,执行 if(jianceshu == 0) { i = 0; while(big[i] != null) { k++; i++; } //向后添加 int ii = 0; int kk = k+k; for(i = k; i<kk; i++) { big[i] = big[ii]; ii++; } //求子数组最大值 BigInteger b0=new BigInteger("0"); bigrmax = big[0]; int geshu = 0; for(i = 0; i<kk; i++) { if((bigmax.compareTo(b0) < 0) || bigmax.equals(b0)){ bigmax = big[i]; //System.out.println("+++"+bigmax);//记录 }else { bigmax = bigmax.add(big[i]); geshu++; //System.out.println("///"+bigmax);//记录 } if((bigrmax.compareTo(bigmax) < 0)&&(geshu < k)) { bigrmax = bigmax; //System.out.println("---"+bigrmax);//记录 } } System.out.println("结果:"+bigrmax); } } }