From a21b3cf5f5905495fbf0a8c1037596364e31a72d Mon Sep 17 00:00:00 2001 From: ErdemT09 Date: Sun, 25 Jul 2021 11:48:29 +0300 Subject: [PATCH 1/2] 631-Add Initial Solution --- .../hard/DesignExcelSumFormula.java | 71 +++++++++++++++++++ 1 file changed, 71 insertions(+) create mode 100644 src/main/java/algorithms/curated170/hard/DesignExcelSumFormula.java diff --git a/src/main/java/algorithms/curated170/hard/DesignExcelSumFormula.java b/src/main/java/algorithms/curated170/hard/DesignExcelSumFormula.java new file mode 100644 index 00000000..737361ed --- /dev/null +++ b/src/main/java/algorithms/curated170/hard/DesignExcelSumFormula.java @@ -0,0 +1,71 @@ +package algorithms.curated170.hard; + +import java.util.Arrays; + +public class DesignExcelSumFormula { + + class Excel { + Object[][] matrix; + int m, n; + + public Excel(int height, char width) { + this.m = height; + this.n = width - 'A'; + + matrix = new Object[m][n + 1]; + + for (int i = 0; i < m; i++) { + Arrays.fill(matrix[i], 0); + } + } + + public void set(int row, char column, int val) { + matrix[row - 1][column - 'A'] = val; + } + + public int get(int row, char column) { + if (matrix[row - 1][column - 'A'] instanceof Integer) { + return (int) matrix[row - 1][column - 'A']; + } else { + return calculate(row, column); + } + } + + public int sum(int row, char column, String[] numbers) { + matrix[row - 1][column - 'A'] = numbers; + return calculate(row, column); + } + + public int calculate(int row, char column) { + String[] numbers = (String[]) matrix[row - 1][column - 'A']; + + int sum = 0; + for (String num : numbers) { + if (num.indexOf(":") < 0) { + char c = num.charAt(0); + int r = Integer.parseInt(num.substring(1)); + + sum += get(r, c); + } else { + String num1 = num.substring(0, num.indexOf(":")); + String num2 = num.substring(num.indexOf(":") + 1); + + char c1 = num1.charAt(0); + int r1 = Integer.parseInt(num1.substring(1)); + + char c2 = num2.charAt(0); + int r2 = Integer.parseInt(num2.substring(1)); + + for (int i = r1; i <= r2; i++) { + for (char j = c1; j <= c2; j++) { + sum += get(i, j); + } + } + } + } + + return sum; + } + } + +} From 93865bd1e82c448bd058eac66fe426c45cce56ba Mon Sep 17 00:00:00 2001 From: ErdemT09 Date: Sun, 25 Jul 2021 12:00:17 +0300 Subject: [PATCH 2/2] 631-Refactor Method --- .../hard/DesignExcelSumFormula.java | 74 +++++++++++-------- 1 file changed, 45 insertions(+), 29 deletions(-) diff --git a/src/main/java/algorithms/curated170/hard/DesignExcelSumFormula.java b/src/main/java/algorithms/curated170/hard/DesignExcelSumFormula.java index 737361ed..0fce30c7 100644 --- a/src/main/java/algorithms/curated170/hard/DesignExcelSumFormula.java +++ b/src/main/java/algorithms/curated170/hard/DesignExcelSumFormula.java @@ -5,67 +5,83 @@ public class DesignExcelSumFormula { class Excel { + + private static final int NO_POS = -1; Object[][] matrix; - int m, n; + private final int M, N; public Excel(int height, char width) { - this.m = height; - this.n = width - 'A'; + M = height; + N = colIdx(width); - matrix = new Object[m][n + 1]; + matrix = new Object[M][N + 1]; - for (int i = 0; i < m; i++) { + for (int i = 0; i < M; i++) { Arrays.fill(matrix[i], 0); } } - public void set(int row, char column, int val) { - matrix[row - 1][column - 'A'] = val; + public void set(int row, char col, int val) { + matrix[row - 1][colIdx(col)] = val; } - public int get(int row, char column) { - if (matrix[row - 1][column - 'A'] instanceof Integer) { - return (int) matrix[row - 1][column - 'A']; + public int get(int row, char col) { + if (matrix[row - 1][colIdx(col)] instanceof Integer) { + return (int) matrix[row - 1][colIdx(col)]; } else { - return calculate(row, column); + return calculate(row, col); } } - public int sum(int row, char column, String[] numbers) { - matrix[row - 1][column - 'A'] = numbers; - return calculate(row, column); + public int sum(int row, char col, String[] numbers) { + matrix[row - 1][colIdx(col)] = numbers; + return calculate(row, col); } - public int calculate(int row, char column) { - String[] numbers = (String[]) matrix[row - 1][column - 'A']; + public int calculate(int row, char col) { + String[] numbers = (String[]) matrix[row - 1][colIdx(col)]; int sum = 0; for (String num : numbers) { - if (num.indexOf(":") < 0) { + int separatorIdx = num.indexOf(":"); + + if (separatorIdx == NO_POS) { char c = num.charAt(0); int r = Integer.parseInt(num.substring(1)); sum += get(r, c); } else { - String num1 = num.substring(0, num.indexOf(":")); - String num2 = num.substring(num.indexOf(":") + 1); + sum += sumSubMatrix(num, separatorIdx); + } + } + + return sum; + } - char c1 = num1.charAt(0); - int r1 = Integer.parseInt(num1.substring(1)); + private int sumSubMatrix(String num, int separatorIdx) { + int sum = 0; + + String cell1 = num.substring(0, separatorIdx); + String cell2 = num.substring(separatorIdx + 1); + + char c1 = cell1.charAt(0); + int r1 = Integer.parseInt(cell1.substring(1)); - char c2 = num2.charAt(0); - int r2 = Integer.parseInt(num2.substring(1)); + char c2 = cell2.charAt(0); + int r2 = Integer.parseInt(cell2.substring(1)); - for (int i = r1; i <= r2; i++) { - for (char j = c1; j <= c2; j++) { - sum += get(i, j); - } - } + for (int i = r1; i <= r2; i++) { + for (char j = c1; j <= c2; j++) { + sum += get(i, j); } } - return sum; } + + private int colIdx(char col) { + return col - 'A'; + } + } }