标题:表格计算

某次无聊中, atm 发现了一个很老的程序。这个程序的功能类似于 Excel ,它对一个表格进行操作。
不妨设表格有 n 行,每行有 m 个格子。
每个格子的内容可以是一个正整数,也可以是一个公式。
公式包括三种:
1. SUM(x1,y1:x2,y2) 表示求左上角是第 x1 行第 y1 个格子,右下角是第 x2 行第 y2 个格子这个矩形内所有格子的值的和。
2. AVG(x1,y1:x2,y2) 表示求左上角是第 x1 行第 y1 个格子,右下角是第 x2 行第 y2 个格子这个矩形内所有格子的值的平均数。
3. STD(x1,y1:x2,y2) 表示求左上角是第 x1 行第 y1 个格子,右下角是第 x2 行第 y2 个格子这个矩形内所有格子的值的标准差。
标准差即为方差的平方根。

方差就是:每个数据与平均值的差的平方的平均值,用来衡量单个数据离开平均数的程度。

公式都不会出现嵌套。

如果这个格子内是一个数,则这个格子的值等于这个数,否则这个格子的值等于格子公式求值结果。
输入这个表格后,程序会输出每个格子的值。atm 觉得这个程序很好玩,他也想实现一下这个程序。

「输入格式」
第一行两个数 n, m 。
接下来 n 行输入一个表格。每行 m 个由空格隔开的字符串,分别表示对应格子的内容。
输入保证不会出现循环依赖的情况,即不会出现两个格子 a 和 b 使得 a 的值依赖 b 的值且 b 的值依赖 a 的值。

「输出格式」
输出一个表格,共 n 行,每行 m 个保留两位小数的实数。
数据保证不会有格子的值超过 1e6 。

「样例输入」
3 2
1 SUM(2,1:3,1)
2 AVG(1,1:1,2)
SUM(1,1:2,1) STD(1,1:2,2)

「样例输出」
1.00 5.00
2.00 3.00
3.00 1.48

「数据范围」
对于 30% 的数据,满足: n, m <= 5
对于 100% 的数据,满足: n, m <= 50

资源约定:
峰值内存消耗(含虚拟机) < 512M
CPU消耗  < 2000ms

思路:非常抱歉的是代码量不少,如果有人有更好的解法可以私信我。这个题目实际上思路非常清晰,分析每个单元格中的内容,如果出现SUM、AVG、STD则进行数据处理。而在进行数据处理的过程中,我们需要获取到其中的x1, x2, y2, y2才能继续进行(由于这四个值不仅仅是个位数的情况,这里采用s.indexOf()的方法找准位置,然后进行分割,其中两个“,”的划分,第一个“,”直接截取,第二个“,”先将第一个“,”截去,然后再二次截取)。获取到四个坐标之后,在求解表达式的过程中要判断类似sum中包含sum的情况,所以要递归调用func()函数。

完整代码如下:

import java.util.Scanner;public class Main
{static String[][] str = new String[50][50];static double[][] d = new double[50][50];static int n, m;public static void main(String[] args) {Scanner in = new Scanner(System.in);n = in.nextInt();m = in.nextInt();for (int i = 1; i <= n; i++) {for (int j = 1; j <= m; j++) {String c = in.next();str[i][j] = c;}}for (int i = 1; i <= n; i++) {for (int j = 1; j <= m; j++) {if (str[i][j].charAt(0) < '0' || str[i][j].charAt(0) > '9') {d[i][j] = func(str[i][j], i, j);} else {d[i][j] = Double.valueOf(str[i][j]);}}}for (int i = 1; i <= n; i++) {for (int j = 1; j < m; j++) {System.out.printf("%.2f ",d[i][j]);}System.out.printf("%.2f\n", d[i][m]);}}/*** 这里必须采用函数的方式将这里包起来,因为有的sum处理里面还会包含sum,所以需要再次调用这里的函数。* */private static double func(String string, int i, int j) {// TODO Auto-generated method stubint subce[] = sub(str[i][j]);if (str[i][j].substring(0, 3).equals("SUM")) {return sum(subce);} else if (str[i][j].substring(0, 3).equals("AVG")) {return avg(subce);} else if (str[i][j].substring(0, 3).equals("STD")) {return std(subce);} else {return -1;}}/*** 三个表达式的计算都很简单* 在求avg和std中,要有注意如何求四个坐标所围矩阵中单元格的个数,可以使用(x2-x1+1)*(y2-y1+1),也可以直接计数* 由于每个计算都有可能出现类似sum的计算中包含sum的情况,所以要进行判断,再次调用func()* */private static double sum(int[] ce2) {// TODO Auto-generated method stubdouble cnt = 0.0;for (int i = ce2[1]; i <= ce2[3]; i++) {for (int j = ce2[2]; j <= ce2[4]; j++) {if (str[i][j].charAt(0) < '0' || str[i][j].charAt(0) > '9') {cnt += func(str[i][j], i, j);} else {cnt += Double.valueOf(str[i][j]);}}}return cnt;}private static double avg(int[] ce2) {// TODO Auto-generated method stubdouble cnt = 0.0;int q = 0;for (int i = ce2[1]; i <= ce2[3]; i++) {for (int j = ce2[2]; j <= ce2[4]; j++) {if (str[i][j].charAt(0) < '0' || str[i][j].charAt(0) > '9') {cnt += func(str[i][j], i, j);} else {cnt += Double.valueOf(str[i][j]);}q++;}}return cnt/q;}private static double std(int[] ce2) {// TODO Auto-generated method stubdouble cnt = 0.0;int q = 0;double x = avg(ce2);for (int i = ce2[1]; i <= ce2[3]; i++) {for (int j = ce2[2]; j <= ce2[4]; j++) {if (str[i][j].charAt(0) < '0' || str[i][j].charAt(0) > '9') {cnt += Math.pow(func(str[i][j], i, j) - x, 2);} else {cnt += Math.pow(Double.valueOf(str[i][j]) - x, 2);}q++;}}return Math.sqrt(cnt/q);}/**** 下面是对表达式进行截取拆分获取x1,x2,y1,y2的过程* 由于出现了两次",",所以在获取的过程中要注意,第二个","的获取可以先将前一个","连同之前的内容截去,然后再进行一次截取*    */private static int[] sub(String s) {// TODO Auto-generated method stubint[] ce = new int[5];for (int i = 0; i < ce.length; i++) {ce[i] = 0;}int befKuohao = s.indexOf('(');int firstDouhao = s.indexOf(',');int maohao = s.indexOf(':');int secDouhao = s.substring((s.indexOf(',')+1)).indexOf(',') + (s.indexOf(',')+1);int aftKuohao = s.indexOf(')');ce[1] = Integer.valueOf(s.substring(befKuohao+1, firstDouhao));ce[2] = Integer.valueOf(s.substring(firstDouhao+1, maohao));ce[3] = Integer.valueOf(s.substring(maohao+1, secDouhao));ce[4] = Integer.valueOf(s.substring(secDouhao+1, aftKuohao));return ce;}
}

蓝桥杯第六届国赛JAVA真题----表格计算相关推荐

  1. 蓝桥杯第六届国赛JAVA真题----切开字符串

    标题:切开字符串 Pear有一个字符串,不过他希望把它切成两段. 这是一个长度为N(<=10^5)的字符串. Pear希望选择一个位置,把字符串不重复不遗漏地切成两段,长度分别是t和N-t(这两 ...

  2. 蓝桥杯第六届国赛JAVA真题----奇怪的数列

    标题:奇怪的数列 从X星截获一份电码,是一些数字,如下: 13 1113 3113 132113 1113122113 .... YY博士经彻夜研究,发现了规律: 第一行的数字随便是什么,以后每一行都 ...

  3. 蓝桥杯第六届国赛JAVA真题----密文搜索

    标题:密文搜索 福尔摩斯从X星收到一份资料,全部是小写字母组成. 他的助手提供了另一份资料:许多长度为8的密码列表. 福尔摩斯发现,这些密码是被打乱后隐藏在先前那份资料中的. 请你编写一个程序,从第一 ...

  4. 蓝桥杯第七届国赛JAVA真题----平方末尾

    平方末尾 能够表示为某个整数的平方的数字称为"平方数" 比如,25,64 虽然无法立即说出某个数是平方数,但经常可以断定某个数不是平方数. 因为平方数的末位只可能是:[0, 1, ...

  5. 蓝桥杯第六届省赛JAVA真题----生命之树

    生命之树 在X森林里,上帝创建了生命之树. 他给每棵树的每个节点(叶子也称为一个节点)上,都标了一个整数,代表这个点的和谐值. 上帝要在这棵树内选出一个非空节点集S,使得对于S中的任意两个点a,b,都 ...

  6. 蓝桥杯第六届省赛JAVA真题----垒骰子

    垒骰子 赌圣atm晚年迷恋上了垒骰子,就是把骰子一个垒在另一个上边,不能歪歪扭扭,要垒成方柱体. 经过长期观察,atm 发现了稳定骰子的奥秘:有些数字的面贴着会互相排斥! 我们先来规范一下骰子:1 的 ...

  7. 蓝桥杯第七届国赛JAVA真题----机器人塔

    机器人塔 X星球的机器人表演拉拉队有两种服装,A和B. 他们这次表演的是搭机器人塔. 类似: 队内的组塔规则是: A 只能站在 AA 或 BB 的肩上.     B 只能站在 AB 或 BA 的肩上. ...

  8. 蓝桥杯第七届国赛JAVA真题----七星填数

    七星填数 如图[图1.png]所示. 在七角星的14个节点上填入1~14 的数字,不重复,不遗漏. 要求每条直线上的四个数字之和必须相等. 图中已经给出了3个数字. 请计算其它位置要填充的数字,答案唯 ...

  9. 蓝桥杯第六届省赛JAVA真题----打印菱形

    打印菱形 给出菱形的边长,在控制台上打印出一个菱形来. 为了便于比对空格,我们把空格用句点代替. 当边长为8时,菱形为: .......* ......*.* .....*...* ....*.... ...

最新文章

  1. Java 集合系列17之 TreeSet详细介绍(源码解析)和使用示例
  2. linux wlan进程名称,linux无线网络配置无线网卡驱动安装与wlan802.11配置
  3. pandas常见错误类型TypeError: bad operand type for unary ~: 'float'
  4. php cdi_使用CDI的InjectionPoint注入配置值
  5. php mysql 取最小值_php – 根据另一个值更新最小值 – MySql
  6. 最大公约数python语言算法_使用Python求解最大公约数的实现方法
  7. 设置RadioButton控件中文本的位置.
  8. 网络电视测试软件,「图」电视直播源有效性检测软件 m3u8 IPTV checker_高清时代论坛...
  9. 立方体和球形体积的计算
  10. TracePro v6.02 Win32-ISO 1CD(光学机构仿真软件\
  11. 运行 jar 文件_如何运行JAR文件
  12. SQL-(增)-插入操作
  13. 数据库笔试题(答案)
  14. ckplayer播放器 直播
  15. 季冠2022年会 | 我们乘风而去 必将破浪而归
  16. 华硕服务器系统安装win7系统教程,华硕重装系统教程
  17. PhoneGap 微信插件 for iOS
  18. Zabbix - 微信报警
  19. 【数字图像处理】特征提取轮廓特征对黑色素瘤恶性/良性分类
  20. 简直太猛了!GitHub《植物大战僵尸》重磅开源,两天就破千Star!

热门文章

  1. openglshader实现虚拟场景_虚拟演播室设计原则
  2. 提示tun虚拟网卡没有安装_Win10家庭版通过Hyper-V安装Centos7+Python3.7过程总结
  3. java从键盘上录入学生人数和每个学生的姓名以及分数,按照分数降序输出,学生名次、学生姓名、学生分数
  4. win+mysql自动备份吗_Windows下mysql自动备份的最佳方案
  5. C语言指针变量的定义和使用
  6. Python小白的数学建模课-07.选址问题
  7. java 线程安全问题_java线程安全问题原因及解决办法
  8. gateway动态路由_无语!SpringCloud Gateway动态路由之Nacos,我已经讲得很清楚了
  9. c语言检查字符数组不为空,【C语言】检查输入是否为空,如为空,程序退出
  10. 如何区分电梯卡为id卡ic卡_电梯刷卡系统基本属性