21/02/18刷题记录Day1

面试题 01.08. 零矩阵

编写一种算法,若M × N矩阵中某个元素为0,则将其所在的行与列清零。

思路

1.考虑到一边遍历一边清零时可能会将原来的0混淆进去,所有应当找出所有的0
2.找出所有的0要考虑行列,因此使用两个hashset(有去重功能),也可以考虑使用两个数组(数组两次遍历花费时间更少

语法

Hashset 的遍历分为两种:


//通过迭代器遍历HashSet
Iterator<String> it = hash.iterator();
while(it.hasNext()) {
System.out.println(it.next());
}
 
System.out.println("==================");
 
//通过加强for循环遍历HashSet
for(String s: hash) {
System.out.println(s);
}

foreach本质也是通过实现了iterator迭代器进行遍历的

错误信息

Type mismatch: cannot convert from   HashSet<Integer> to int

错误原因:没有将Integer转换成int
转换代码:

Integer.intValue()

完整代码

public void setZeroes(int[][] matrix) {
		HashSet<Integer> cSet = new HashSet<Integer>();
		HashSet<Integer> rSet = new HashSet<Integer>();
		int m = matrix.length;
		int n = matrix[0].length;
		for(int i = 0; i < m; i++) {
			for(int j = 0; j < n; j++) {
				if(matrix[i][j] == 0) {
					rSet.add(i);
					cSet.add(j);
				}
			}
		}
		for (Integer e : rSet) {
			int i = e.intValue();
			for(int j = 0; j < n; j++) {
				matrix[i][j] = 0;
			}
		}
		for(Integer e : cSet) {
			int j = e.intValue();
			for(int i = 0; i < m; i++) {
				matrix[i][j] = 0;
			}
		}

    }

在这里插入图片描述

566. 重塑矩阵

在MATLAB中,有一个非常有用的函数 reshape,它可以将一个矩阵重塑为另一个大小不同的新矩阵,但保留其原始数据。给出一个由二维数组表示的矩阵,以及两个正整数r和c,分别表示想要的重构的矩阵的行数和列数。重构后的矩阵需要将原始矩阵的所有元素以相同的行遍历顺序填充。如果具有给定参数的reshape操作是可行且合理的,则输出新的重塑矩阵;否则,输出原始矩阵

思路

1.重塑的矩阵的元素个数需要和原矩阵的元素个数一致
2.基于前一条,只需要判断大小是否一致,不一致返回原数组本身即可。

语法

注意到在矩阵中,第x个数的对应位置为:

row:x / c
col: x % c
//其中c是矩阵的列数

完整代码

public int[][] matrixReshape(int[][] nums, int r, int c) {
        int m = nums.length;
		int n = nums[0].length;
		if(m * n != r * c) {
			return nums;
		}
		
		int[][] ans = new int[r][c];
		for(int x = 0; x < m * n; x++) {
			ans[x / c][x % c] = nums[x / n][x % n];
		}
		return ans;

    }

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_42180334/article/details/113845763