題1:平安科技在線編程大賽:一份“奇妙”的銀行流水
“求評論”
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;
}
}