周赛笔记

275 周赛复盘

矩阵是否唯一

:point_right: Leetcode 链接在新窗口打开

function checkValid(matrix: number[][]): boolean {
    let len = matrix.length

    for (let i = 1; i < len; i++) {
        if (!checkRow(matrix, i) || !checkCol(matrix, i)) {
            return false
        }
    }

    return true
};


function checkRow(mat: number[][], row: number): boolean {
    let temp = [], size = mat.length
    for (let col = 0; col < size; col++) {
        temp[mat[row][col]] = true
    }

    for (let i = 1; i <= size; i++) {
        if (!temp[i]) return false
    }
    return true
}

function checkCol(mat: number[][], col: number): boolean {
    let temp = [], size = mat.length

    for (let row = 0; row < size; row++) {
        temp[mat[row][col]] = true
    }

    for (let i = 1; i <= size; i++) {
        if (!temp[i]) return false

    }

    return true
}
function checkValid(mat: number[][]) {
    let n = mat.length
    for (let i = 0; i < n; i++) {
        let rows = new Set(), cols = new Set()
        for (let j = 0; j < n; j++) {
            rows.add(mat[i][j])
            cols.add(mat[j][i])
        }

        if (rows.size < n || cols.size < n) return false
    }


    return true
}

276 场周赛

:point_right:Leetcode 链接在新窗口打开

将字符串拆分为若干长度为 k 的组

:point_right:Leetcode 链接在新窗口打开

字符串 s 可以按下述步骤划分为若干长度为 k 的组:

第一组由字符串中的前 k 个字符组成,第二组由接下来的 k 个字符串组成,依此类推。每个字符都能够成为某一个组的一部分。 对于最后一组,如果字符串剩下的字符不足 k 个,需使用字符 fill 来补全这一组字符。 注意,在去除最后一个组的填充字符 fill (如果存在的话) 并按顺序连接所有的组后,所得到的字符串应该是 s。

给你一个字符串 s,以及每组的长度 k 和一个用于填充的字符 fill,按上述步骤处理之后,返回一个字符串数组,该数组表示 s 分组后每个组的组成情况。

提示

  • 输入:s = “abcdefghij”,k = 3,fill = “x”
  • 输出:[“abc”,“def”,“ghi”,“jxx”]
  • 解释: 与前一个例子类似,形成前三组 “abc”、“def” 和 “ghi”。 对于最后一组,字符串中仅剩下字符 ‘j’ 可以用。为了补全这一组,使用填充字符 ‘x’ 两次。 因此,形成 4 组,分别是 “abc”、“def”、“ghi” 和 “jxx”。
function divideString(s: string, k: number, fill: string): string[] {
    let ans = [], len = s.length

    for (let i = 0; i < len; i = i + k){
        let char = s.slice(i, i+k)

        while (char.length < k) {
            char += fill
        }

        ans.push(char)  
    }
  
    return ans
};

得到目标值的最少行动次数

:point_right:Leetcode 链接在新窗口打开

你正在玩一个整数游戏。从整数 1 开始,期望得到整数 target。

在一次行动中,你可以做下述两种操作之一:

递增,将当前整数的值加 1 (即,x = x + 1)。 加倍,使当前整数的值翻倍 (即,x = 2 * x)。 在整个游戏过程中,你可以使用递增操作任意次数。但是只能使用加倍操作至多 maxDoubles 次。

给你两个整数 target 和 maxDoubles,返回从 1 开始得到 target 需要的最少行动次数。

提示

  • 输入:target = 19,maxDoubles = 2
  • 输出:7
  • 解释:最初,x = 1。 递增 3 次,x = 4。 加倍 1 次,x = 8。 递增 1 次,x = 9。 加倍 1 次,x = 18。 递增 1 次,x = 19。
function minMoves(target: number, maxDoubles: number): number {
    if (maxDoubles === 0) return target - 1

    let max = 0, count = 0

    while ((target > 1) && (count < maxDoubles)) {
        if (target % 2 !== 0) {
            target--
        } else {
            target = target / 2
            count++
        }
        max++
    }

    while (target > 1 && count >= maxDoubles) {
        max++
        target--
    }

    return max
};

解决智力问题 (待复盘) ⭐⭐

:point_right:Leetcode 链接在新窗口打开

给你一个下标从 0 开始的二维整数数组 questions,其中 questions[i] = [pointsi,brainpoweri]。

这个数组表示一场考试里的一系列题目,你需要按顺序 (也就是从问题 0 开始依次解决),针对每个问题选择解决或者跳过操作。解决问题 i 将让你获得 pointsi 的分数,但是你将无法解决接下来的 brainpoweri 个问题 (即只能跳过接下来的 brainpoweri 个问题)。如果你跳过问题 i,你可以对下一个问题决定使用哪种操作。

比方说,给你 questions = [[3,2],[4,3],[4,4],[2,5]] : 如果问题 0 被解决了,那么你可以获得 3 分,但你不能解决问题 1 和 2。 如果你跳过问题 0,且解决问题 1,你将获得 4 分但是不能解决问题 2 和 3。 请你返回这场考试里你能获得的最高分数

提示

  • 输入:questions = [[3,2],[4,3],[4,4],[2,5]]
  • 输出:5
  • 解释:解决问题 0 和 3 得到最高分。
    • 解决问题 0:获得 3 分,但接下来 2 个问题都不能解决。
    • 不能解决问题 1 和 2
    • 解决问题 3:获得 2 分 总得分为:3 + 2 = 5。没有别的办法获得 5 分或者多于 5 分。
function mostPoints(questions: number[][]): number {

};

同时运行 N 台电脑的最长时间 (待复盘) ⭐⭐

:point_right:Leetcode 链接在新窗口打开

你有 n 台电脑。给你整数 n 和一个下标从 0 开始的整数数组 batteries,其中第 i 个电池可以让一台电脑运行 batteries[i] 分钟。你想使用这些电池让全部 n 台电脑同时运行。

一开始,你可以给每台电脑连接至多一个电池。然后在任意整数时刻,你都可以将一台电脑与它的电池断开连接,并连接另一个电池,你可以进行这个操作任意次。新连接的电池可以是一个全新的电池,也可以是别的电脑用过的电池。断开连接和连接新的电池不会花费任何时间。

注意,你不能给电池充电。

请你返回你可以让 n 台电脑同时运行的最长分钟数。

function maxRunTime(n: number, batteries: number[]): number {
//
};
上次更新:
贡献者: Joe