# 第 270 场周赛题解
# Q1 2094. 找出 3 位偶数 (opens new window)
签到。
class Solution2094 {
fun findEvenNumbers(digits: IntArray): IntArray {
val set = HashSet<Int>()
for (i in 0 until digits.size - 2) {
for (j in i + 1 until digits.size - 1) {
for (k in j + 1 until digits.size) {
val a = digits[i]
val b = digits[j]
val c = digits[k]
set.add(a * 100 + b * 10 + c)
set.add(a * 100 + c * 10 + b)
set.add(b * 100 + a * 10 + c)
set.add(b * 100 + c * 10 + a)
set.add(c * 100 + a * 10 + b)
set.add(c * 100 + b * 10 + a)
}
}
}
return set.sorted().filter { it >= 100 && it % 2 == 0 }.toIntArray()
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# Q2 2095. 删除链表的中间节点 (opens new window)
链表题,都先转成线性表~
class Solution2095 {
fun deleteMiddle(head: ListNode?): ListNode? {
val l = head.toIntArray().toArrayList()
if (l.size == 0 || l.size == 1) return null
l.removeAt(l.size / 2)
return l.toIntArray().toListNode()
}
}
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
# Q3 2096. 从二叉树一个节点到另一个节点每一步的方向 (opens new window)
先找到根节点到两个节点的路径,公共祖先部分可以舍弃,剩下的就是第一个节点都是UP,再拼接第二个节点的路径。
class Solution2096 {
fun getDirections(root: TreeNode?, startValue: Int, destValue: Int): String {
var sl = ""
var sr = ""
fun dfs(node: TreeNode?, sb: ArrayList<Char>) {
if (node == null) return
if (node.`val` == startValue) {
sl = sb.joinToString("")
}
if (node.`val` == destValue) {
sr = sb.joinToString("")
}
sb.add('L')
dfs(node.left, sb)
sb.removeAt(sb.lastIndex)
sb.add('R')
dfs(node.right, sb)
sb.removeAt(sb.lastIndex)
}
dfs(root, ArrayList())
var start = 0
while (start in sl.indices && start in sr.indices) {
if (sl[start] == sr[start]) {
start++
continue
}
break
}
return sl.substring(start, sl.length).map { "U" }.joinToString("") + sr.substring(start, sr.length)
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
# Q4 2097. 合法重新排列数对 (opens new window)
欧拉通路,技巧就是先DFS每一个next,再add到结果中,这样就可以保证每个环都会走到。
class Solution2097 {
fun validArrangement(pairs: Array<IntArray>): Array<IntArray> {
val map = HashMap<Int, Stack<IntArray>>()
val deg = HashMap<Int, Int>()
pairs.forEach {
map[it[0]] = map.getOrDefault(it[0], Stack())
map[it[0]]!!.push(it)
deg[it[0]] = deg.getOrDefault(it[0], 0) - 1
deg[it[1]] = deg.getOrDefault(it[1], 0) + 1
}
var start = pairs[0][0]
for (key in deg.keys) {
// 入度比出度大1,则以该点为起始点
if (deg[key] == -1) {
start = key
break
}
}
val ans = ArrayList<IntArray>()
fun dfs(cur: Int, arr: ArrayList<IntArray>) {
while (map[cur]?.isNotEmpty() == true) {
val next = map[cur]?.pop() ?: return
dfs(next[1], arr)
arr.add(next)
}
}
dfs(start, ans)
return ans.reversed().toTypedArray()
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32