首页 > 代码库 > 英雄会上的一些题
英雄会上的一些题
题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; } }
英雄会上的一些题
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。