二维数组置0问题学习记录

刚充值了一波信仰,贴篇代码过个瘾~今日高产赛母猪

前不久做了一道题,把一个二维数组内0所在行列都置0。

一开始写的是这样的:

for (int i = 0; i < m; ++i ) {
	for (int j = 0; j < n; ++j) {
		if ( 0 == ar[i][j]) {
			ar[i][0] == 0;
			ar[0][j] == 0;
		}
	}
]

for (int i = 0; i < m; ++i) {
	if ( 0 == ar[i][0]){
		for (int j = 0; j < n; ++j)
			ar[i][j] = 0
	}
}

for (int j = 0; j < n; ++j) {
	if ( 0 == ar[0][j]){
		for (int i = 0; i < m; ++i)
			ar[i][j] = 0
	}
}

然后被指出这段代码有很大的问题,它直接将0所在行列清0,后面会导致整个数组都变成0。于是在师兄指导下改为将遍历到0的行列记录 清空再继续检查。新代码如下:

void SetZero(int **data, int r, int c)
{ 
   /**
* Set_zero
* URL:
* 2017-1-21
*/

in *zeroCols = new int[c];//建立辅助空间 memset(zeroCols, 0, sizeof(int)*c); bool isZeroRow = false; //逐行查找0 for (int i = 0; i < r; i++) { isZeroRow = false; for (int j = 0; j < c; j++) { if (!data[i][j]) { isZeroRow = true; zeroCols[j] = 1; } } if (isZeroRow) { memset(data[i], 0, sizeof(int)*c);//清 } } //逐列查找0 for (int j = 0; j<c; j++) { if (zeroCols[j]) { for (int i = 0; i < r; i++) { data[i][j] = 0; } } } }

欢迎各位继续指正~

另外晒一波信仰哈哈

99599000366745980

431940182153597883

500191385218192562

667178930020410356

圣手二代104忍者白青轴 一本满足~

17 Comments

Name *

E-mail *

Website

  1. 甲子百科

    好难,看了好久才明白

  2. 微课堂

    键盘喜欢

  3. 林木木

    太专业,留言一下