普通二维数组到稀疏数组的互相转换(java)

晚上闲来无事,就去翻了翻数据结构和算法,发现第一讲是稀疏数组;
这个以前听说过概念,就想着,先自己写一下,再看看别人是怎么写的,比我写的好在哪,下面是代码

请无视命名…


	/*-	把这个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;
	}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值