# 第 273 场周赛题解

# Q1 5963. 反转两次的数字 (opens new window)

不是0且没有后缀0。(我就直接暴力了...)

class SolutionA {
    fun isSameAfterReversals(num: Int): Boolean {
        return num.toString().reversed().toInt().toString().reversed().toInt() == num
    }
}
1
2
3
4
5

# Q2 5964. 执行所有后缀指令 (opens new window)

双循环暴力。由于中间可能出圈,所以不方便用前缀和处理。

class SolutionB {
    fun executeInstructions(n: Int, startPos: IntArray, s: String): IntArray {
        val ans = IntArray(s.length)
        for (i in s.indices) {
            var (x, y) = startPos
            var step = 0
            for (j in i until s.length) {
                when (s[j]) {
                    'L' -> y--
                    'R' -> y++
                    'U' -> x--
                    'D' -> x++
                }
                if (x !in 0 until n) break
                if (y !in 0 until n) break
                step++
            }
            ans[i] = step
        }
        return ans
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22

# Q3 5965. 相同元素的间隔之和 (opens new window)

记录相同数字的位置。从左到右,从右到左两次遍历即可。

class SolutionC {
    fun getDistances(arr: IntArray): LongArray {
        val map = HashMap<Int, ArrayList<Int>>()
        for (i in arr.indices) {
            map[arr[i]] = map.getOrDefault(arr[i], arrayListOf())
            map[arr[i]]!!.add(i)
        }
        val ans = LongArray(arr.size)
        map.forEach { t, u ->
            var left = 0L
            var c = 0L
            for (i in u.indices) {
                c++
                left += u[i]
                val tmp = u[i] * c - left
                ans[u[i]] += tmp
            }
            var right = 0L
            c = 0L
            for (i in u.indices.reversed()) {
                c++
                right += u[i]
                val tmp = u[i] * c - right
                ans[u[i]] -= tmp
            }
        }

        return ans
    }
}
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

# Q4 5966. 还原原数组 (opens new window)

将数组拆分成两个数组,且每一位的差相同,即对于任意ii都有a[i]b[i]==da[i] - b[i] == d

当构建数组成功后,原数组就是这两个数组的平均值。(使用双指针可以比Map判断更早中断)

class SolutionD {
    fun recoverArray(nums: IntArray): IntArray {
        nums.sort()
        for (k in nums.indices) {
            val map = HashMap<Int, Int>()
            // 等差数列的差
            val d = nums[k] - nums[0]
            if (d == 0 || d % 2 != 0) continue
            val left = ArrayList<Int>()
            val right = ArrayList<Int>()
            for (i in nums.indices) {
                val key = nums[i]
                val lk = nums[i] - d
                if (lk in map.keys) {
                    map[lk] = map.getOrDefault(lk, 0) - 1
                    right.add(key)
                    if (map[lk] == 0) {
                        map.remove(lk)
                    }
                } else {
                    map[key] = map.getOrDefault(key, 0) + 1
                    left.add(key)
                }
            }
            if (left.size == right.size) {
                val ans = IntArray(nums.size / 2)
                for (i in ans.indices) {
                    ans[i] = (left[i] + right[i]) / 2
                }
                return ans
            }
        }
        return intArrayOf()
    }
}
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
33
34
35