蓝桥杯第六届国赛JAVA真题----表格计算
生活随笔
收集整理的這篇文章主要介紹了
蓝桥杯第六届国赛JAVA真题----表格计算
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
標題:表格計算
某次無聊中, 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真题----表格计算的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: LING与HQL(三)
- 下一篇: 蓝桥杯(java)基础练习 龟兔赛跑