java 数据结构与算法之稀疏矩阵算法,BTAJ 面试有关散列(哈希)表的面试题详解
11 11 2 1 2 1 2 3 2
解读抽取后的稀疏数组:
[0][0] 位置为二维数组行
[0][1] 位置为二维数组列
[0][2] 位置为二维数组有效点数(1 和 2 )总数
[1][0] 为 第一颗棋子行坐标
[1][1] 为 第一颗棋子列坐标
[1][2] 为 第一颗
棋子的值(1 表示黑子)
依次类推,记录棋盘所有棋子的坐标以及值
辅助图:
总结: 稀疏算法也是一个二维数组,最终行的个数为 总数+1,列为 3
//countTemp + 1 为行 (countTemp 为当前棋盘中有效数(!=0 的数))//3 为列 int sparseArray[][] = new int[countTemp + 1][3];
辅助图:
创建二维数组
这里以 11 * 11 的二维数组为例
//行 public static int mRow = 11;//列 public static int mColumn = 11;
//TODO 创建原始二维数组 数据 int chessArr1[][] = new int[mRow][mColumn];
//给黑子 白子赋值 chessArr1[1][2] = 1;//1 为黑子 chessArr1[2][3] = 2;//2 为白子// chessArr1[5][2] = 1;
System.out.println("原始的二维数组为:");for (int i = 0; i < chessArr1.length; i++) {for (int j = 0; j < chessArr1[i].length; j++) {System.out.printf("%d\t", chessArr1[i][j]);}System.out.println();}
运行结果为:
原始的二维数组为:0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
二维数组转稀疏数组
先记录棋盘中的所有棋子(!=0 的数)
//先得到棋盘中的所有棋子 !=0 的数
int countTemp = 0;//遍历行 for (int i = 0; i < mRow; i++) {//遍历列 for (int j = 0; j < mColumn; j++) {if (chessArr1[i][j] != 0) {countTemp++;}}}System.out.println("非 0 个数有 " + countTemp + "个");
创建稀疏数组:
给第一行赋值:
int sparseArray[][] = new int[countTemp + 1][3];
//TODO 给稀疏数组第一行赋值//行 sparseArray[0][0] = mRow;//列 sparseArray[0][1] = mColumn;//总数 sparseArray[0][2] = countTemp;
循环二维数组,将!=0 的值赋值给稀疏数组并打印:
//用来记录是第几个非 0 数据 int countTemp2 = 0;//遍历二维数组,将非 0 的数据放到 sparseArray[][]中 for (int i = 0; i < mRow; i++) {//遍历列 for (int j = 0; j < mColumn; j++) {if (chessArr1[i][j] != 0) {countTemp2++;sparseArray[countTemp2][0] = i;//i = 行 sparseArray[countTemp2][1] = j;//j = 列 sparseArray[countTemp2][2] = chessArr1[i][j];//chessArr1[i][j] = 具体的值}}}
//TODO 输出稀疏数组 System.out.println("稀疏数据为:");//遍历行 for (int i = 0; i < sparseArray.length; i++) {//遍历列 for (int j = 0; j < sparseArray[i].length; j++) {System.out.printf("%d\t", sparseArray[i][j]);}System.out.println();}
稀疏数组运行结果为:
稀疏数据为:11 11 2 1 2 1 2 3 2
稀疏数组转二维数组
创建二维数组
行为稀疏数组 [0][0] 位置
列为稀疏数组 [0][1] 位置
循环次数为二维数组长度
评论