簡體   English   中英

int[][]中的IntStream有問題,不知道allMatch()在做什么

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM