Java算法之矩阵中出现指定数字的同行同列数字清零
Posted 笔触狂放
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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的位置,将行和列上的所有值累加在一起
效果图如下:
结果为:
以上是关于Java算法之矩阵中出现指定数字的同行同列数字清零的主要内容,如果未能解决你的问题,请参考以下文章