晚上闲来无事,就去翻了翻数据结构和算法,发现第一讲是稀疏数组;
这个以前听说过概念,就想着,先自己写一下,再看看别人是怎么写的,比我写的好在哪,下面是代码
请无视命名…
/*- 把这个2维数组 稀疏
* 0 0 0 0 0
* 0 1 2 0 0
* 0 0 0 0 0
* 0 0 0 0 0
* 0 0 0 0 0
*/
public static void main(String[] args) {
int[][] yuanshuzu = new int[7][7];
yuanshuzu[1][1] = 1;
yuanshuzu[1][2] = 2;
System.out.println("原数组~~");
for (int[] is : yuanshuzu) {
for (int i : is) {
System.out.print(i + " ,");
}
System.out.println();
}
System.out.println("稀疏后~~");
int[][] xiShu = xiShu(yuanshuzu);
for (int[] is : xiShu) {
for (int i : is) {
System.out.print(i + " ,");
}
System.out.println();
}
System.out.println("还原后~~");
int[][] huanYuan = huanYuan(xiShu);
for (int[] is : huanYuan) {
for (int i : is) {
System.out.print(i + " ,");
}
System.out.println();
}
}
/**
* 将普通的二维数组稀疏,名字太随意~~
*
* @Description
* @Date 2019年9月4日 下午10:45:33
* @param xishu
* @return
*/
public static int[][] xiShu(int[][] xishu) {
int len = 0; // 记录原数组有多少条数据
for (int[] is : xishu) {
for (int i : is) {
if (i != 0) {
len++;
}
}
}
int[][] newXiShu = new int[len + 1][3]; // ;第0行是原数组的信息,所以行数会比数据多1;
newXiShu[0][0] = xishu.length;// 0.0下标 表示原数组 有多少行
newXiShu[0][1] = xishu[0].length;// 0.1下标 表示原数组 有多少列
newXiShu[0][2] = len; // 表示原数组有多少有效数字
int Xindex = 1; // 稀疏数组记录原数组值是从第二行,第1个位置开始;
for (int i = 0; i < xishu.length; i++) {
for (int j = 0; j < xishu[0].length; j++) {
if (xishu[i][j] != 0) {
newXiShu[Xindex][0] = i;
newXiShu[Xindex][1] = j;
newXiShu[Xindex++][2] = xishu[i][j];
}
}
}
return newXiShu;
}
/**
* 将一个稀疏数组还原为正规的数组~~
*
* @Description
* @Date 2019年9月4日 下午10:46:06
* @param xishu
* @return
*/
public static int[][] huanYuan(int[][] xishu) {
int[][] yuanShuZu = new int[xishu[0][0]][xishu[0][1]];
for (int i = 1; i < xishu.length; i++) {
yuanShuZu[xishu[i][0]][xishu[i][1]] = xishu[i][2];
}
return yuanShuZu;
}