1. 程式人生 > >返回一個整數數組中最大子數組的和(文件)

返回一個整數數組中最大子數組的和(文件)

錯誤 組成 多功能 復雜度 ati 最大子數組 一次 () 也有

要求

1.輸入一個整型數組,數組裏有正數也有負數。

2.數組中連續的一個或多個整數組成一個子數組,每個子數組都有一個和。

3.求所有子數組的和的最大值。要求時間復雜度為O(n)。

4.要求數組從文件讀取

5.如果輸入文件的參數有錯誤, 這個程序應該能正常退出, 並顯示相應的錯誤信息。

思路及源代碼

  前三個要求與上一篇要求相同,所以可以在上一次的基礎上新增代碼實現所需功能。然而,一開始的確實現了一部分功能,但是後來想要實現更多功能時,越改代碼bug出現的越多,到最後只能重寫。

package test;

import java.io.BufferedReader;
import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; public class FindMaxArray { public static int length=0; public static int[] readArray() { int[] a = new int[100]; int t; String num=""; try { BufferedReader br
= new BufferedReader(new FileReader("Array.txt")); while ((t = br.read()) != -1) { if(t==45 && num=="") { //讀到負號 num="-"; continue; } if(t>=48 && t<=57) //讀到數字 num += (char
)t; if((t<48 || t>57) && num!="" && num!="-") { //讀到非數字,如果此時num不為空或不為負號則將其轉化為int類型 a[length++]=Integer.parseInt(num); if(t==45) //可能沒有間隔符,讀到的是負號,則賦給num,下次直接使用 num="-"; else num=""; } //如果num為空或為負號,而且讀到的是非數字,那麽讀下一個字符 } if(!(num=="" || num=="-")) //文件末尾無間隔符或為負號,則錄入最後一個數 a[length++]=Integer.parseInt(num); /*System.out.println(length); for(int i=0;i<length;i++) System.out.println(a[i]);*/ br.close(); } catch (FileNotFoundException e) { System.out.println("文件不存在!"); } catch (IOException e) { System.out.println("文件讀取異常,請檢查是否擁有文件讀取權限!"); } catch (NumberFormatException e) { long n = Long.parseLong(num); if(n > 2147483647) System.out.println("第" + length + "個數" + n + "大於整型最大值2147483647!"); else System.out.println("第" + length + "個數" + n + "小於整型最小值-2147483648!"); } catch(ArrayIndexOutOfBoundsException e) { System.out.println("此程序只支持100個整數內查找最大子數組的和!"); } return a; } public static void findMaxArray(int[] a) { int[] b = new int[100]; //數塊數組 b[0] = a[0]; int j=0,max=0,maxnum=0; try { for(int i=1;i<length;i++) { if(a[i]<0 && b[j]>0) b[++j] = a[i]; else if(a[i]>0 && b[j]<0) b[++j] = a[i]; else if(a[i]<=0 && b[j]<0) b[j] += a[i]; else if(a[i]>=0 && b[j]>0) b[j] += a[i]; } for(int i=0;i<j;i++) System.out.println(b[i]); if(b[0]<=0 && b[1]==0) { //所有數均小於等於0時 max=a[0]; for(int i=1;i<10;i++) if(max<a[i]) max=a[i]; } else { max=b[0]; for(int i=0;i<=j;i++) if(max<b[i]) { max=b[i]; maxnum=i; } int t=0; for(int i=maxnum;i<=j-2;i+=2) { //從最大數塊所在位置向右運算 t=t+b[i+1]+b[i+2]; //最大數塊右方的數塊和,如果存在大於0的,則可以加入最大子數組和的運算 if(t>0) { max+=t; t=0; } } t=0; for(int i=maxnum;i>=2;i-=2) { //從最大數塊所在位置向左運算 t=t+b[i-1]+b[i-2]; //最大數塊左方的數塊和,如果存在大於0的,則可以加入最大子數組和的運算 if(t>0) { max+=t; t=0; } } } }catch(NumberFormatException e) { System.out.println("運算過程中出現超出整型運算範圍的整數!"); } System.out.println("最大子數組的和為:" + max); } public static void main(String[] args) { findMaxArray(readArray()); } }

  未完待續,有空補充

返回一個整數數組中最大子數組的和(文件)