<span style="font-family: 微软雅黑, 宋体, Arial; background-color: rgb(255, 255, 255);">题目详情</span>

一份银行流水数据,因打印模糊导致部分金额不清楚。

收入、支出、余额满足以下3条规则:

1、收入、支出、余额三列都是数字

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

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

程序语言: java

请按照规则编写算法,修复不清楚的值

输入描述:

输入数据最多25行,每行都包含四个数据,分别是:数据编号,收入、支出、余额,模糊的数据以?表示,它们之间以;隔开。

以文件结尾。第一组数据为初始数据值,收入、支出、余额数据保留2位小数。

输出描述:

以输入的数据顺序输出修复后的数据。

答题说明

输入样例:

流水记录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

############################################################################

代码修改多次,本地运行测试多组数据均没有问题,但在线测试始终出错,不知道是何原因?

**** 代码修改之后,考虑到了第一行模糊的情况,且测试多组数据如下,还是没有通过!!!:

初始账单如下:
流水记录ID;收入;支出;余额
1;10.00;?;1000.00;
2;10.02;?;?;
3;?;?;890.02;
4;?;?;?;
5;1000.00;0.00;?;
6;0.00;200.00;1900.00;
7;?;?;1780.00;
8;?;?;?;
9;?;10.00;2400.00;
10;100.00;?;?;
最终账单如下:
流水记录ID;收入;支出;余额
1;10.00;0.00;1000.00
2;10.02;0.00;1010.02
3;0.00;120.00;890.02
4;209.98;0.00;1100.00
5;1000.00;0.00;2100.00
6;0.00;200.00;1900.00
7;0.00;120.00;1780.00
8;630.00;0.00;2410.00
9;0.00;10.00;2400.00
10;100.00;0.00;2500.00

##代码采用递归思路实现,贴出代码如下##

##有更好的思路欢迎交流##

package com.study;
import java.io.*;
import java.math.*;
import java.util.Scanner;
/*** * @author* @date 2014-08-06* * 一份银行流水数据,因打印模糊导致部分金额不清楚。
收入、支出、余额满足以下3条规则:
1、收入、支出、余额三列都是数字
2、同一行收入和支出的值不能同时为非零值
3、第N-1行余额(+第N行收入或-第N行支出)=第N行余额
程序语言: java
请按照规则编写算法,修复不清楚的值输入描述:
输入数据最多25行,每行都包含四个数据,分别是:数据编号,收入、支出、余额,模糊的数据以?表示,它们之间以;隔开。
以文件结尾。第一组数据为初始数据值,收入、支出、余额数据保留2位小数。
输出描述:
以输入的数据顺序输出修复后的数据。**/
@SuppressWarnings("unused")
public class WaterBill {/*** 记录账单:编号,收入,支出,余额*/static BigDecimal[][] bills=new BigDecimal[25][4];static int length=0;//账单的实际编号/*** 一份神奇的银行流水,计算模糊流水账单* @throws Exception */ @SuppressWarnings("resource")public static void main(String[] args) throws Exception {// TODO Auto-generated method stub//BufferedReader bf=new BufferedReader(new FileReader("E:/java/bills.txt"));int i=0;//字符串形式读取账单详情String[][] bill=new String[25][4];String line = null;System.out.println("请输入账单:(每输入一行以enter键开始下一行输入。以'EOF'结束)");System.out.println("ID;"+"收入;"+"支出;"+"余额");Scanner scn = new Scanner(System.in);while (!"EOF".equals(line = scn.nextLine())) {int j=0;String[] vStrs = line.split(";");for (String str : vStrs) {bill[i][j++]=str;}i++;length=i;if(length>25){System.out.println("提示:输入账单最多25行!");System.exit(0);}}/*//字符串形式读取账单详情BufferedReader bf=new BufferedReader(new FileReader("E:/java/bills.txt"));String[][] bill=new String[25][4];String line = null;while ((line = bf.readLine()) != null) {int j=0;String[] vStrs = line.split(";");for (String str : vStrs) {bill[i][j++]=str;}i++;length=i;if(length>25){System.out.println("提示:输入账单最多25行!");System.exit(0);}}*///将读取的数据转换成可用于计算的BigDecimal类型,并保留两位小数//模糊数据用null表示for(int k=0;k<length;k++){for(int m=0;m<4;m++){if(m==0){bills[k][m]=new BigDecimal(bill[k][m]).setScale(0);}else{if(bill[k][m].equals("?")){bills[k][m]=null;}else{bills[k][m]=new BigDecimal(bill[k][m]).setScale(2,BigDecimal.ROUND_HALF_UP);}}}}System.out.println("初始账单如下:");System.out.print("流水记录ID"+";"+"收入"+";"+"支出"+";"+"余额"+"\n");for(int k=0;k<length;k++){for(int m=0;m<4;m++){if(bills[k][m]==null)System.out.print("?"+";");            elseSystem.out.print(bills[k][m]+";");}System.out.println();}//计算模糊账单new WaterBill();System.out.println("\n最终账单如下:");System.out.print("流水记录ID"+";"+"收入"+";"+"支出"+";"+"余额"+"\n");for(int k=0;k<length;k++){System.out.print(bills[k][0]+";"+bills[k][1]+";"+bills[k][2]+";"+bills[k][3]+"\n");}}WaterBill(){for(int i=0;i<length;i++){for(int j=1;j<4;j++){if(bills[i][j]==null){bills[i][j]=countBills(i,j);         }}} }//计算模糊账单BigDecimal countBills(int index,int indexY){BigDecimal temp;if(indexY==1){//判断是否有多项均模糊if(bills[index][2]==null){//1、收入和支出均模糊if(index==0){System.out.println("初始账单的收入和支出均模糊,无法计算");System.exit(0);}//如果余额也模糊,先计算出来if(bills[index][3]==null){bills[index][3]=countBills(index,3);       }//计算(收入-支出)的值temp=bills[index][3].subtract(bills[index-1][3]);if(temp.compareTo(BigDecimal.ZERO)<0){bills[index][1]=(BigDecimal.ZERO).setScale(2);bills[index][2]=temp.abs();}else{bills[index][1]=temp;bills[index][2]=(BigDecimal.ZERO).setScale(2);} }else{//2、收入未知,支出非零,那么收入=0if(bills[index][2].compareTo(BigDecimal.ZERO)!=0){bills[index][1]=(BigDecimal.ZERO).setScale(2);}else{//3、收入未知,支出为零,计算结果if(bills[index][3]==null)bills[index][3]=countBills(index,3);//递归回来之后bills[index-1][3]=null,无法计算if(bills[index-1][3]==null){System.out.println("模糊项太多,无法计算!!!");System.exit(0);}bills[index][indexY]=bills[index][3].add(bills[index][2]).subtract(bills[index-1][3]);}}}else if(indexY==2){//判断是否有多项均模糊if(bills[index][1].compareTo(BigDecimal.ZERO)!=0){bills[index][2]=(BigDecimal.ZERO).setScale(2);}else{if(bills[index][3]==null)bills[index][3]=countBills(index,3);//递归回来之后bills[index-1][3]=null,无法计算if(bills[index-1][3]==null){System.out.println("模糊项太多,无法计算!!!");System.exit(0);}bills[index][indexY]=bills[index-1][3].add(bills[index][1]).subtract(bills[index][3]);}}else if(indexY==3){//余额计算可以与当月收支和上月余额相关,也可以与下月收支和下月余额相关if(index==0){for(int k=1;k<=3;k++){if(bills[index+1][k]==null){bills[index+1][k]=countBills(index+1, k);}}}else{if(bills[index][1]!=null&&bills[index][2]!=null&&bills[index-1][3]!=null){bills[index][indexY]=bills[index-1][3].add(bills[index][1]).subtract(bills[index][2]);}else{if(index+1>length){System.out.println("模糊项太多,无法计算!!!");System.exit(0);}//判断第index+1行是否也有模糊项,若有,先计算出来for(int k=1;k<=3;k++){if(bills[index+1][k]==null){bills[index+1][k]=countBills(index+1, k);}}bills[index][indexY]=bills[index+1][3].add(bills[index+1][2]).subtract(bills[index+1][1]);}}}if(bills[index][indexY].compareTo(BigDecimal.ZERO)<0){System.out.println("账单中不应该有负值");System.exit(0);}//System.out.println((index+1)+","+indexY+":"+bills[index][indexY]);return bills[index][indexY];}}

一份“奇妙”的银行流水相关推荐

  1. 一份银行流水数据,因打印模糊导致部分金额不清楚。

    一份银行流水数据,因打印模糊导致部分金额不清楚. 收入.支出.余额满足以下3条规则: 1.收入.支出.余额三列都是数字 2.同一行收入和支出的值不能同时为非零值 3.第N-1行余额(+第N行收入或-第 ...

  2. 面试虚报工资,没想要求提供银行流水怎么办?|智测优聘总结

    这年头,有不少求职者为了跳槽后能拿下满意的高薪,从而虚报之前的工资,却没想到败在了提供银行流水的环节,错失offer.今天,人才初筛招聘网智测优聘就来和大家说说这个问题. 一.HR为什么要求职者提供银 ...

  3. 面试时薪资报高了,HR要银行流水怎么办?

    面试时薪资报高了,HR要银行流水怎么办? 常有小伙伴问 :" HR问我要薪资流水,可是我报薪资的时候多报了,当时是想多要点薪资,但现在薪资流水对不上咋办?" 有的人认为HR这是在侵 ...

  4. 避雷快手!确认面试通过,提交银行流水和个人信息后,被告知其他人接了offer!...

    今天来给大家排个雷. 一位网友分享了自己在快手的面试体验,提醒大家避雷快手: 面试后接到收集流水邮件,和hr确认面试通过后提交了银行流水和个人信息,但后来被告知有更合适的人接了offer. 楼主表示非 ...

  5. 基于巨杉数据库的银行流水查询系统

    背景: 银行流水账单俗称银行卡存取款交易对账单,也称银行账户交易对账单.指的是客户在一段时间内与银行发生的存取款业务交易清单.一般而言,在申请贷款或者信用卡时,银行或其他金融机构会要求借款人提供申请者 ...

  6. 某头条程序员吐槽:前同事银行流水造假,背调也是找同事编的!工资翻了300%!自己老实巴交提供真实银行流水,却惨遭压薪!...

    换工作时,许多公司会让求职者提供上家的银行流水,以此了解求职者的实际收入.大多想通过跳槽来涨薪的人都会担忧,如果上家工资不够高会影响自己涨薪.究竟是提供真实的银行流水,还是造假多要点薪资?这是打工人们 ...

  7. 银行流水你真的会看吗?

    (1)银行流水的的构成 每个银行流水的构成要素可能有所差距,但是总整体上来说,银行流水的构成基本是差不多的. 正常的银行流水一般都会包含以下几个构成因素: 账号.户名.交易日期.对方帐号.对方户名.交 ...

  8. 【SQL开发实战技巧】系列(十四):计算消费后的余额计算银行流水累计和计算各部门工资排名前三位的员工

    系列文章目录 [SQL开发实战技巧]系列(一):关于SQL不得不说的那些事 [SQL开发实战技巧]系列(二):简单单表查询 [SQL开发实战技巧]系列(三):SQL排序的那些事 [SQL开发实战技巧] ...

  9. 5月底被裁,6月拿到赔偿和工资,下家公司要求提供近半年银行流水来定薪,能不能只提供钱最多的6月流水?...

    银行流水能"花式"造假吗? 一位被裁的前阿里员工问: 本人5月底被阿里裁掉,6月底拿到赔偿金和5月份工资,目前下家公司面试已通过,在面试过程中说自己是主动离职.现在对方需要提供近半 ...

最新文章

  1. 看看 Grunt 的源码(一):grunt-cli 源码解析
  2. python 画三维函数图-如何用Matplotlib 画三维图的示例代码
  3. Exchange 2007迁移2010后部分手机邮箱不能使用解决办法
  4. 用不好PPT模板的本质原因是什么,怎么办
  5. Angular CLI的简单使用(1)
  6. php中source,PHP中source #N问题的解决方法
  7. RDataMining系列:Chapter 4 Decision Trees --决策树实现,未完待续
  8. mysql与win8有冲突吗_Win8系统Defender功能和安全软件冲突怎么办
  9. JS让本地图片预览不再难-jquery插件
  10. flex弹性盒子的兼容性写法
  11. [文摘20070816]家(周国平)
  12. 软件工程-图书馆管理系统
  13. 目标检测YOLO系列论文对比
  14. 聊一聊我在 B 站上自学编程的经历吧!
  15. “一键淘宝”将淘宝网店免费转移到手机客户端android教程
  16. erphpdown9.64插件加Modown1.9模板主题下载
  17. arcgis双标准纬线等角圆锥投影_常用地图投影之圆锥投影
  18. 计算机组成原理————寄存器寻址方式大总结
  19. plt 字体 times new roman Ubuntu添加windows启动项
  20. Hybrid App开发 四大主流平台

热门文章

  1. Unable to find a version of the runtime to run this application解决方法
  2. 2023年迎来分水岭,谁将领跑智驾赛道规模化量产?
  3. Double.parseDouble是什么?
  4. APT攻击各阶段简介
  5. 小程序--数据更新--点赞功能
  6. 确定kafka对应的zookeeper版本
  7. xcode清理缓存_腾讯柠檬清理,真的比 CleanMyMac 好用么?
  8. 微信小程序 通过场景值判断从什么路径进入微信小程序
  9. 基于FPGA的双路低频信号发生器设计
  10. SOLIDWORKS凸轮和铰链等机械结构怎么配合?