# 第 275 场周赛题解

# Q1 2133. 检查是否每一行每一列都包含全部整数 (opens new window)

模拟。

class SolutionA {
    fun checkValid(matrix: Array<IntArray>): Boolean {
        val n = matrix.size
        for (i in 0 until n) {
            val a = HashSet<Int>()
            val b = HashSet<Int>()
            for (j in 0 until n) {
                a.add(matrix[i][j])
                b.add(matrix[j][i])
            }
            if (a.size != n || b.size != n) return false
        }
        return true
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

# Q2 2134. 最少交换次数来组合所有的 1 II (opens new window)

滑动窗口,由于有首尾相连,可以直接将两个原数组拼接起来。窗口大小使用1的数量,然后看覆盖最多1的窗口即可。

class SolutionB {
    fun minSwaps(nums: IntArray): Int {
        val c = nums.count { it == 1 }
        val arr = ArrayList<Int>()
        arr.addAll(nums.toTypedArray())
        arr.addAll(nums.toTypedArray())

        var cur = 0
        var ans = 0
        for (i in arr.indices) {
            cur += arr[i]
            if (i >= c) {
                cur -= arr[i - c]
            }
            ans = maxOf(ans, cur)
        }
        return c - ans
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

# Q3 5978. 统计追加字母可以获得的单词数 (opens new window)

每个字母只能出现一次,直接用Set处理排序后的字符串。targettarget遍历删除一位是否在Set中即可。

class SolutionC {
    fun wordCount(startWords: Array<String>, targetWords: Array<String>): Int {
        val arr = Array<HashSet<String>>(28) { HashSet() }
        startWords.forEach {
            val n = it.length
            arr[n].add(it.toSortedSet().joinToString(""))
        }
        var ans = 0
        targetWords.forEach {
            val n = it.length - 1
            val sorted = it.toSortedSet().joinToString("")
            if ((0..n).any {
                    val sb = sorted.substring(0, it) + sorted.substring(it + 1, n + 1)
                    sb in arr[n]
                }) ans++
        }
        return ans
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

# Q4 5979. 全部开花的最早一天 (opens new window)

垃圾题目,sortBysortBy写错成sortedBysortedBy,掉大分了。

class SolutionD {
    fun earliestFullBloom(plantTime: IntArray, growTime: IntArray): Int {
        val arr = ArrayList<Pair<Int, Int>>()
        for (i in plantTime.indices) {
            arr.add(Pair(plantTime[i], growTime[i]))
        }
        arr.sortBy { -it.second }
        var day = 0
        var ans = 0
        for (i in arr.indices) {
            day += arr[i].first
            ans = maxOf(ans, day + arr[i].second)
        }
        return ans
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16