![](/img/trans.png)
[英]Sometimes I don't know which classes certain methods belong to. What am I doing wrong?
[英]A problem with IntStream in int[][], I don't know what allMatch() doing
成名后, CodeBots決定一起搬進新大樓。 每個房間都有不同的費用,其中一些是免費的,但有傳言說所有的免費房間都鬧鬼! 由於CodeBot非常迷信,他們拒絕入住任何免費房間,或任何免費房間下方的任何房間。
給定一個矩陣,一個整數矩形矩陣,其中每個值代表房間的成本,您的任務是返回適合CodeBots的所有房間的總和(即:將所有未出現的值相加低於 0)。
示例:對於:
matrix = [[0, 1, 1, 2],
[0, 5, 0, 0],
[2, 0, 3, 3]]
輸出應該是
matrixElementsSum(matrix) = 9
誰能解釋allMatch
在這段代碼中是如何工作的?
int matrixElementsSum(int[][] matrix) {
return IntStream.range(0, matrix.length)
.map(i -> IntStream.range(0, matrix[0].length)
.map(j -> IntStream.range(0, i)
.allMatch(k -> matrix[k][j] > 0)
? matrix[i][j] : 0)
.sum())
.sum();
}
matrix = [[0, 1, 1, 2],
[0, 5, 0, 0],
[2, 0, 3, 3]]
這里是矩陣,程序遍歷矩陣中的每個元素(ei matrix[i, j]), i
表示當前行, j
表示當前列,判斷元素是否加入sum的語句是:
IntStream.range(0, i).allMatch(k -> matrix[k][j] > 0)
該語句意味着“直到”當前元素的所有元素都應該 MATCH >0
,這意味着不是自由的。
allMatch()
方法接受一個IntPredicate
對象。 IntPredicate
是一個函數式接口,它的“函數式方法”是test(int)
。 您的代碼將所有元素傳遞給它並檢查它們是否都匹配>0 。 您也可以在此處使用anyMatch()
方法。 那么你的代碼將是這樣的:
int matrixElementsSum(int[][] matrix) {
return IntStream.range(0, matrix.length)
.map(i -> IntStream.range(0, matrix[0].length)
.map(j -> IntStream.range(0, i)
.anyMatch(k -> matrix[k][j] == 0)
? 0 : matrix[i][j] )
.sum())
.sum();
}
此外,該算法的時間復雜度為f(i,j) = j.(i(i+1)/2) = O(ji^2)
其中i
是行數, j
是列數。
function solution(matrix) {
const numberOfRows = matrix.length;
const numberOfCols = matrix.length * matrix[0].length;
const sum = 0;
const rooms = [];
const hauntedRows = [];
matrix.forEach((row, idx) => {
row.forEach((item, cIdx) => {
if(item === 0) {
hauntedRows.push(cIdx);
return;
}
if(hauntedRows.includes(cIdx)) {
return;
}
rooms.push(item)
})
})
return rooms.reduce((prevVal, currentVal) => prevVal + currentVal, 0)
}
這是我想出的解決方案。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.