【Java】算法之矩阵中出现指定数字的同行同列数字清零

题目:指定阶数,生成随机数的矩阵,然后指定任意数字为目标,将出现该数字的所在的行和列进行所有数字全部清零

这里生成了10阶的矩阵,随机产生了100个数字,假设设定出现0数字的位置的行和列的数字全部清零,效果如下:

这些0所出现的位置的行和列都要清零,

最后的结果为:

题目意思我相信应该大家都清楚了,那么接下来看解题思路:

解题思路:
 * 1.定义两个一维数组,用于记录二维数组中出现0的位置的横纵坐标的位置,并把该位置赋值为1
 * 2.循环遍历两个一维数组,把记录横坐标的数组中的值为1的下标找出来,同步到二维数组上,把该下标对应的横坐标上全部清零
 * 3.把记录纵坐标的数组中的值为1的下标找出来,同步到二维数组上,把该下标对应的纵坐标上全部清零

代码如下:

package com.lqb;

import java.util.Random;
/**
 * 把二维数组中出现0的位置上的横向和纵向的数字都清零
 * 解题思路:
 * 1.定义两个一维数组,用于记录二维数组中出现0的位置的横纵坐标的位置,并把该位置赋值为1
 * 2.循环遍历两个一维数组,把记录横坐标的数组中的值为1的下标找出来,同步到二维数组上,把该下标对应的横坐标上全部清零
 * 3.把记录纵坐标的数组中的值为1的下标找出来,同步到二维数组上,把该下标对应的纵坐标上全部清零
 */
public class Test4_2 {

	private int[][] e = null;

	public static void main(String[] args) {
		new Test4_2().init(10, 10);
	}
	
	private void init(int row,int col) {
		e=new int[row][col];
		for (int i = 0; i < row; i++) {
			for (int j = 0; j < col; j++) {
				e[i][j]=new Random().nextInt(10);
			}
		}
		print();
	}

	private void print() {
		
		for (int i = 0; i < e.length; i++) {
			for (int j = 0; j < e.length; j++) {
				System.out.print(e[i][j]+" ");
			}
			System.out.println();
		}
		
		int[] rows=new int[e.length];
		int[] cols=new int[e[0].length];
		//通过循环找出二维数组中的出现0的位置的坐标,分别记录在不同的一位数组中
		for (int i = 0; i < cols.length; i++) {
			for (int j = 0; j < cols.length; j++) {
				if (e[i][j]==0) {
					rows[i]=1;
					cols[j]=1;
				}
			}
		}
		
		//在循环遍历两个数组,只要出现1的下标上都全部改为0
		for (int i = 0; i < cols.length; i++) {
			for (int j = 0; j < cols.length; j++) {
				if (rows[i]==1||cols[j]==1) {
					e[i][j]=0;
				}
			}
		}
		System.out.println();
		System.out.println();
		System.out.println();
		for (int i = 0; i < e.length; i++) {
			for (int j = 0; j < e.length; j++) {
				System.out.print(e[i][j]+" ");
			}
			System.out.println();
		}
	}

}

代码量比较少,算法题的重点还是在解题思路和策略上

在日常生活中也见过类似于这种效果的用途,比如开心消消乐的行列消除的效果:

如果这题大家没问题的话,那么看看能不能尝试做一下这题:创建任意阶数的矩阵,随机生成数字,出现0的横纵方向上不能修改,横纵方向上没有出现0的,将其所在位置的横纵方向的数字进行叠加

给定任意阶数的二维数组,10%概率生成0,90%概率非零,行和列上没有0的位置,将行和列上的所有值累加在一起

效果图如下:

结果为:

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

笔触狂放

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值