英雄會上的一些題

題1:平安科技在線編程大賽:一份“奇妙”的銀行流水

“求評論”

題目詳情

一份銀行流水數據,因打印模糊導致部分金額不清楚。                  

收入、支出、餘額滿足以下3條規則:              

1、收入、支出、餘額三列都是數字            

2、同一行收入和支出的值不能同時爲非零值            

3、第N-1行餘額(+第N行收入或-第N行支出)=第N行餘額  

程序語言: java

請按照規則編寫算法,修復不清楚的值


輸入描述:

輸入數據最多25行,每行都包含四個數據,分別是:數據編號,收入、支出、餘額,模糊的數據以?表示,它們之間以;隔開。

以文件結尾。第一組數據爲初始數據值,收入、支出、餘額數據保留2位小數 輸入輸出第一行均爲表頭“流水記錄ID;收入;支出;餘額”。

輸出描述:

以輸入的數據順序輸出修復後的數據。



答題說明

輸入樣例:

流水記錄ID;收入;支出;餘額

1;0.00;51.90;1945.45    

2;0.00;1000.00;?

輸出樣例:

流水記錄ID;收入;支出;餘額

1;0.00;51.90;1945.45

2;0.00;1000.00;945.45


import java.text.DecimalFormat;
import java.util.Scanner;
import java.util.Vector;


public class AmazingBank {
	public static void main(String[] args){
		Vector<Double[]> vector = new Vector<Double[]>();
		Scanner cin = new Scanner(System.in);
		String str = cin.next();
		while(cin.hasNext())
	    {  
			str = cin.next(); 
			if (str.equals("EOF")){
				break;
			}
			String[] strArr = str.split(";");
			Double[] tmp = new Double[3];
			for (int i = 1; i < 4; i++){
				if (strArr[i].equals("?")){
					tmp[i-1] = null;
				}else{
		 			tmp[i-1] = Double.parseDouble(strArr[i]);
		 		}
		 	}
			vector.add(tmp);
	    }
		cin.close();
		
		Vector<Double[]> ans = repairRecord(vector);
		
		DecimalFormat df = new DecimalFormat("#0.00");
		System.out.println("流水記錄ID;收入;支出;餘額");
		for (int i = 0; i < ans.size(); i++){
			System.out.print(""+(i+1)+";");
			Double[] tmp = ans.get(i);

			if (null != tmp[0])
				System.out.print(df.format(tmp[0])+";");
			else
				System.out.print("?;");
			if (null != tmp[1])
				System.out.print(df.format(tmp[1])+";");
			else
				System.out.print("?;");
			if (null != tmp[2])
				System.out.print(df.format(tmp[2])+"\n");
			else
				System.out.print("?\n");
		}
	}
	
	public static Vector<Double[]> repairRecord(Vector<Double[]> arr){
		int arr_len = arr.size();
		int i = 0;
		int max_while = arr_len * 3; //最壞情況的搜索次數
		int count = 0; 
		while(i < arr_len && count < max_while){
			Double[] xz_element = arr.get(i);
			if (null != xz_element[0]){
				if (0.0 < xz_element[0]){
					if (null == xz_element[1]){
						xz_element[1] = 0.0;
					}
				}
			}else{
				if (null != xz_element[1]){
					if (0.0 < xz_element[1]){
						xz_element[0] = 0.0;
					}
				}
			}

			if (null == xz_element[2] && 0 != i){
				Double[] qm_element = arr.get(i-1);
				if (null != qm_element[2] && null != xz_element[0] && null != xz_element[1]){
					xz_element[2] = qm_element[2] +xz_element[0]-xz_element[1];
				}
			}else{
				if (0 != i){
					Double[] qm_element = arr.get(i-1);
					if (null != qm_element[2]){
						double diff = xz_element[2] - qm_element[2];
						if (diff > 0){
							xz_element[0] = diff;
							xz_element[1] = 0.0;
						}else{
							xz_element[0] = 0.0;
							xz_element[1] = -diff;
						}
					}
				}
			}
			
			arr.remove(i);
			arr.add(i, xz_element);
			
			if (isElementOK(xz_element)){
				if (0 != i){
					Double[] qm_element = arr.get(i-1);
					if (!isElementOK(qm_element)) {
						qm_element[2] = xz_element[2] - xz_element[0] + xz_element[1];
						arr.remove(i-1);
						arr.add(i-1, qm_element);
						i--;
					}else{
						i++;
					}
				}else{
					i++;
				}
			}else{
				i++;
			}
			
			count++;
		}

		return arr;
	}
	
	// 判斷一條記錄是否完整
	private static boolean isElementOK(Double[] element){
		boolean ans = true;
		for (int i = 0; i < element.length; i++){
			if (null == element[i]){
				ans = false;
				break;
			}
		}
		
		return ans;
	}
}


發佈了59 篇原創文章 · 獲贊 17 · 訪問量 34萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章