分享一道面试题,要求1.5小时内完成,如下:
观测下面数字矩阵,编写一个方法实现之。
输入 3, 输出内容到文件:
1 2 3
8 9 4
7 6 5
输入 5, 输出内容到文件:
01 02 03 04 05
16 17 18 19 06
15 24 25 20 07
14 23 22 21 08
13 12 11 10 09
输入 10, 输出内容到文件:
001 002 003 004 005 006 007 008 009 010
036 037 038 039 040 041 042 043 044 011
035 064 065 066 067 068 069 070 045 012
034 063 084 085 086 087 088 071 046 013
033 062 083 096 097 098 089 072 047 014
032 061 082 095 100 099 090 073 048 015
031 060 081 094 093 092 091 074 049 016
030 059 080 079 078 077 076 075 050 017
029 058 057 056 055 054 053 052 051 018
028 027 026 025 024 023 022 021 020 019
输入 11, 输出内容到文件:
001 002 003 004 005 006 007 008 009 010 011
040 041 042 043 044 045 046 047 048 049 012
039 072 073 074 075 076 077 078 079 050 013
038 071 096 097 098 099 100 101 080 051 014
037 070 095 112 113 114 115 102 081 052 015
036 069 094 111 120 121 116 103 082 053 016
035 068 093 110 119 118 117 104 083 054 017
034 067 092 109 108 107 106 105 084 055 018
033 066 091 090 089 088 087 086 085 056 019
032 065 064 063 062 061 060 059 058 057 020
031 030 029 028 027 026 025 024 023 022 021
在下当时是没能写出来,不过走出门口那刻才突然想出方法。。。所以有问题卡住时建议起身走走。
在下思路:
- 首先观察示例输出,得出其规律为对于输入数n,数字矩阵的数字个数为n^2,最大数为n^2,边长数字个数为n,矩阵数字排列为以左上角为起点,顺时针旋向内旋转至最大数。
- 反射性地,我想到用一个二维数组去存放数字矩阵。然后用一个List<String> xyList 按螺旋顺序存放二维数组的坐标对。
- for each 1 到 n^2 个数,取对应xyList的坐标,根据坐标把数字写入二维数组。
- 根据二维数组write line to 文件。
代码:
import java.io.*; import java.util.*; public class NumMatrix { private List<String> getRotateXY( int num ) { List<String> list = new ArrayList<String>(); // 走出门口想到的关键那步, // 这个 level 指的是根据输入数字得出矩阵“从外到内”的数字边框层数 // 如2 有1层,3有3层, 5有3层, 10有5层, 11有6层 int levl = (num % 2) == 0 ? num/2: (num+1)/2; //x,y的分隔符 String sep = ","; // 拿2, 3, 5和 6的矩阵为例,试着在纸上按照 // “从外到内”的每一层, 列出所有坐标, // 注意每一层分四段,每一段以矩阵的四个点划分, // 四个点为起点,右上角,右下角,左下角,层终点, // 以 5 矩阵为例, // 第一层四个点为:0,0 0,4 4,4 4,0 1.0 // 第二层为 :1,1 1,3 3,3 3,3 2,1 // 第三层为 :2,2 - - - 2,2 为最终点 StringBuilder sb = new StringBuilder(); for( int i=1; i<=levl; i++ ) { int x = i-1; int y = i-1; int t = num-i; // 起点到右上角的所有坐标 while( y <= t ) { list.add(sb.append(x).append(sep).append(y).toString()); sb.delete(0, sb.length()); y++; } y = t; x++; // 右上角到右下角的所有坐标 while( x <= t ) { list.add(sb.append(x).append(sep).append(y).toString()); sb.delete(0, sb.length()); x++; } x = t; y--; // 右下角到左下角的所有坐标 while( y >= (i-1) ) { list.add(sb.append(x).append(sep).append(y).toString()); sb.delete(0, sb.length()); y--; } y = i-1; x--; // 左下角到层终点的所有坐标 while( x >= i ) { list.add(sb.append(x).append(sep).append(y).toString()); sb.delete(0, sb.length()); x--; } } return list; } private String[][] getMatrixArr(int num, List<String> list) { String[][] arr = new String[num][num]; // 求输入数平方 int pow = new Double(Math.pow(num, 2)).intValue(); //获取最大数的字符串形式的长度, 用于前缀补“0” int len = Integer.toString(pow).length(); StringBuilder sb = new StringBuilder(); for( int i=1; i<=pow; i++ ) { // 前缀补“0”操作 sb.append(i); int iLen = sb.length(); if( iLen < len ) { sb.delete(0, sb.length()); while( iLen < len ) { sb.append("0"); iLen++; } sb.append(i); } String[] rc = list.get(i-1).split(","); int r = Integer.parseInt(rc[0]); int c = Integer.parseInt(rc[1]); arr[r][c] = sb.toString(); sb.delete(0, sb.length()); } return arr; } //写入数据到文件 public void printToFile(int num, String fileName) { List<String> list = this.getRotateXY(num); String [][] arr = this.getMatrixArr(num, list); FileWriter writer = null; try { writer = new FileWriter(fileName); StringBuilder sb = new StringBuilder(); for( String [] line : arr ) { for( String str : line ) { sb.append(str).append(" "); } String lb = System.getProperty("line.separator"); writer.write(sb.toString() + lb + lb); sb.delete(0, sb.length()); } } catch (IOException e) { e.printStackTrace(); } finally { try { writer.close(); } catch (IOException e) {} } } public static void main(String[] args) { NumMatrix test = new NumMatrix(); test.printToFile(6, "matrix.txt"); } }
其实个人感觉这种方案有些复杂,应该还有别的更巧妙的方法,利用相关的图算法应该是突破口,可惜在下不会图算法。
相关推荐
如果字符串长度不能被完全平方数整除,那么矩阵的行或列可能不完全填满,但这不会影响加密效果。 2. **构建螺旋**:接下来,我们创建一个足够大的二维矩阵,并按照顺时针方向填充字符,就像一个螺旋形的路径。从...
素数问题,整数趣题,数学问题求解,矩阵,回文素数,求100~200之间的素数,阿姆斯特朗数,特殊的完全平方数,求1000以内的完全数,三重回文数,亲密数,自守数,神奇的数字6174,一数三平方,二分法求解方程,牛顿...
182 新完全平方数 183 三重回文数 184 奇数方差 185 统计选票 186 同时整除 187 字符左右排序 188 符号算式求解 189 数字移位 190 统计最高成绩 191 比较字符串长度 192 合并整数 193 矩阵逆置 194 删除指定的字符 ...
54.螺旋矩阵 spiralOrder 66.加一 plusOne 73.矩阵置零 setZeroes 84.柱状图中最大的矩形 largestRectangleArea 152.乘积最大子序列 maxProduct 162.寻找峰值 findPeakElement 动态规划 5.最长回文子串 ...
首先,第一道题目是解决一个螺旋矩阵的数值计算问题。这个问题的关键在于理解螺旋矩阵的填充规律,并且根据坐标确定元素的位置。题目指出,这个队列按照顺时针螺旋的方式向外扩展,每一层的起始数字是连续奇数平方,...
螺旋矩阵 II 买卖股票的最佳时机 买卖股票的最佳时机 II 有冷却时间买卖股票的最佳时机 课程安排 使用随机指针复制列表 最长连续序列 找到镇法官 洪水填充 加油站 实现 Trie(前缀树) 最大和圆形子阵列 奇偶链表 ...
27. **完全平方数**:数论问题,可能需要判断一个数是否为完全平方数。 28. **基本计算器**:涉及到解析表达式和计算逻辑,可能需要理解操作符优先级。 29. **分数加减运算**:基础的分数运算,需要理解分数的运算...
lru缓存leetcode ...螺旋矩阵 - 最大子阵列 - 平方(x) - 搜索二维矩阵 - 搜索二维矩阵 II 最大数 - Self - 之后的较小数字的计数 奇偶链表 - 反向链表 - 两个链表的交集 - 链表循环 - 在旋转排序数组中查找最小值
螺旋矩阵填充** 题目要求根据用户输入的数字n,生成一个n×n的矩阵,其中1至n×n的数字按照顺时针螺旋形式填充。 ```java public static void fillSpiralMatrix(int n) { int[][] matrix = new int[n][n]; int ...
182 新完全平方数 183 三重回文数 184 奇数方差 185 统计选票 186 同时整除 187 字符左右排序 188 符号算式求解 189 数字移位 190 统计最高成绩 191 比较字符串长度 192 合并整数 193 矩阵逆置 194 删除...
螺旋矩阵 减速 784. 字母大小写排列 31. 下一个排列 二分搜索 50. pow(x, n) 34. 查找有序数组中元素的首尾位置 1-是 35. 搜索插入位置 1-是 658. 找出 K 个最近的元素 1-否 33. 在旋转排序数组中搜索 1-否 81. 在...
螺旋矩阵 中等的 60 排列序列 中等的 68 文本对齐 难的 77 组合 中等的 84 直方图中最大的矩形 难的 92 反向链表 II 中等的 117 在每个节点中填充下一个右指针 II 中等的 124 二叉树最大路径和 难的 126 字梯II 难的...
182 新完全平方数 183 三重回文数 184 奇数方差 185 统计选票 186 同时整除 187 字符左右排序 188 符号算式求解 189 数字移位 190 统计最高成绩 191 比较字符串长度 192 合并整数 193 矩阵逆置 194 删除...
182 新完全平方数 183 三重回文数 184 奇数方差 185 统计选票 186 同时整除 187 字符左右排序 188 符号算式求解 189 数字移位 190 统计最高成绩 191 比较字符串长度 192 合并整数 193 矩阵逆置 194 删除...
182 新完全平方数 183 三重回文数 184 奇数方差 185 统计选票 186 同时整除 187 字符左右排序 188 符号算式求解 189 数字移位 190 统计最高成绩 191 比较字符串长度 192 合并整数 193 矩阵逆置 194 删除...
182 新完全平方数 183 三重回文数 184 奇数方差 185 统计选票 186 同时整除 187 字符左右排序 188 符号算式求解 189 数字移位 190 统计最高成绩 191 比较字符串长度 192 合并整数 193 矩阵逆置 194 删除...
182 新完全平方数 183 三重回文数 184 奇数方差 185 统计选票 186 同时整除 187 字符左右排序 188 符号算式求解 189 数字移位 190 统计最高成绩 191 比较字符串长度 192 合并整数 193 矩阵逆置 194 删除...
182 新完全平方数 183 三重回文数 184 奇数方差 185 统计选票 186 同时整除 187 字符左右排序 188 符号算式求解 189 数字移位 190 统计最高成绩 191 比较字符串长度 192 合并整数 ...