今天360的笔试题,100 / 55
第一道题:看了一圈感觉和大家的思路不一样,描述一下我的思路:
从(0, 0)到(m, n),每当(i, j)上的柱子被计算进来之后,有三处变化:
①增加了柱子的表面积(柱子高度为h(i, j),即h(i, j) * 4 + 2);
②减掉两倍的min(h(i, j), h(i - 1, j)),即当前柱子和上一层相邻柱子中较低的那个柱子的高度的两倍;
②减掉两倍的min(h(i, j), h(i, j - 1)),即当前柱子和左边一列相邻柱子中较低的那个柱子的高度的两倍;
代码:
private static int solve(int[][] counts, int rows, int columns){ int[][] results = new int[rows][columns]; for (int i = 0; i < rows; i++){ for (int j = 0; j < columns; j++){ int upCovered = 0, leftCovered = 0; if (i - 1 >= 0) { upCovered = Math.min(counts[i][j], counts[i - 1][j]); results[i - 1][j] -= upCovered; } if (j - 1 >= 0) { leftCovered = Math.min(counts[i][j], counts[i][j - 1]); results[i][j - 1] -= leftCovered; } results[i][j] = counts[i][j] * 4 + 2 - upCovered - leftCovered; } } int result = 0; for (int i = 0; i < rows; i++) { for (int j = 0; j < columns; j++) { result += results[i][j]; } } return result; }
今天又看了看代码,发现那个results数组是没有必要的,空间复杂度可以降到O(1)。
private static int solve(int[][] counts, int rows, int columns) { int result = 0; for (int i = 0; i < rows; i++) { for (int j = 0; j < columns; j++) { int upCovered = 0, leftCovered = 0; if (i - 1 >= 0) { upCovered = Math.min(counts[i][j], counts[i - 1][j]); } if (j - 1 >= 0) { leftCovered = Math.min(counts[i][j], counts[i][j - 1]); } result += counts[i][j] * 4 + 2 - upCovered * 2 - leftCovered * 2; } } return result; }
第二道题:先统计第一个数组和第二个数组的“词频”作为各个数字的“库存”,然后凑最高的mod值,减掉相应的“库存”
代码:
//first和second就是两个数组的“词频”,比如 4 4 4 1 1 和 0 1 2 3 4对应 first = {0,2,0,0,3},second = {1,1,1,1,1} private static int[] solve(int bitCount, int system, int[] first, int[] second) { int[] result = new int[bitCount]; for (int i = 0; i < bitCount; i++) { int tmp = 0, i1 = 0, i2 = 0; for (int p = 0; p < bitCount; p++) { if (first[p] != 0) { for (int q = 0; q < bitCount; q++) { if (second[q] != 0) { int mod = (p + q) % system; if (mod > tmp) { tmp = mod; i1 = p; i2 = q; } } } } } result[i] = tmp; first[i1]--; second[i2]--; } return result; }这道题自己不很满意,首先代码格式很丑,其次复杂度太高,考虑了一下,主要是bitCount这个值,如果是个1万进制数,那么每个用例O(n ^ 3)就是万亿级别的计算量,不超时才怪。
目前想到一种O(n ^ 2)的,还没有实现。