5963. 反转两次的数字

反转 一个整数意味着倒置它的所有位。

  • 例如,反转 2021 得到 1202 。反转 12300 得到 321不保留前导零

给你一个整数 num反转 num 得到 reversed1接着反转 reversed1 得到 reversed2 。如果 reversed2 等于 num ,返回 true ;否则,返回 false

示例 1:

输入:num = 526
输出:true
解释:反转 num 得到 625 ,接着反转 625 得到 526 ,等于 num 。

示例 2:

输入:num = 1800
输出:false
解释:反转 num 得到 81 ,接着反转 81 得到 18 ,不等于 num 。

示例 3:

输入:num = 0
输出:true
解释:反转 num 得到 0 ,接着反转 0 得到 0 ,等于 num 。

提示:

  • 0 <= num <= 106

提交

AC

/**
* @param {number} num
* @return {boolean}
*/
var isSameAfterReversals = function(num) {
const nStr = [...String(num)].reverse().join('')
const rn = Number([...String(Number(nStr))].reverse().join(''))
return rn === num
};

5964. 执行所有后缀指令

现有一个 n x n 大小的网格,左上角单元格坐标 (0, 0) ,右下角单元格坐标 (n - 1, n - 1) 。给你整数 n 和一个整数数组 startPos ,其中 startPos = [startrow, startcol] 表示机器人最开始在坐标为 (startrow, startcol) 的单元格上。

另给你一个长度为 m 、下标从 0 开始的字符串 s ,其中 s[i] 是对机器人的第 i 条指令:'L'(向左移动),'R'(向右移动),'U'(向上移动)和 'D'(向下移动)。

机器人可以从 s 中的任一第 i 条指令开始执行。它将会逐条执行指令直到 s 的末尾,但在满足下述条件之一时,机器人将会停止:

  • 下一条指令将会导致机器人移动到网格外。
  • 没有指令可以执行。

返回一个长度为 m 的数组 answer ,其中 answer[i] 是机器人从第 i 条指令 开始 ,可以执行的 指令数目

示例 1:

示例1

输入:n = 3, startPos = [0,1], s = "RRDDLU"
输出:[1,5,4,3,1,0]
解释:机器人从 startPos 出发,并从第 i 条指令开始执行:
- 0: "RRDDLU" 在移动到网格外之前,只能执行一条 "R" 指令。
- 1: "RDDLU" 可以执行全部五条指令,机器人仍在网格内,最终到达 (0, 0) 。
- 2: "DDLU" 可以执行全部四条指令,机器人仍在网格内,最终到达 (0, 0) 。
- 3: "DLU" 可以执行全部三条指令,机器人仍在网格内,最终到达 (0, 0) 。
- 4: "LU" 在移动到网格外之前,只能执行一条 "L" 指令。
- 5: "U" 如果向上移动,将会移动到网格外。

示例 2:

示例2

输入:n = 2, startPos = [1,1], s = "LURD"
输出:[4,1,0,0]
解释:
- 0: "LURD"
- 1: "URD"
- 2: "RD"
- 3: "D"

提示:

  • m == s.length
  • 1 <= n, m <= 500
  • startPos.length == 2
  • 0 <= startrow, startcol < n
  • s'L''R''U''D' 组成

提交

AC

func executeInstructions(n int, startPos []int, s string) []int {
answer := make([]int, len(s))
for i := 0; i < len(s); i++ {
task := s[i:]
time := 0
nowPos := startPos
for _, action := range task {
next, out := move(action, nowPos, n)
if out {
break
}
time++
nowPos = next
}
answer[i] = time
}
return answer
}

// U: 85 L: 76 D: 68 R: 82
func move(action int32, location []int, n int) (next []int, out bool) {
if action == 76 {
next = []int{location[0], location[1] - 1}
out = location[1]-1 < 0
return
}
if action == 82 {
next = []int{location[0], location[1] + 1}
out = location[1]+1 > n-1
return
}
if action == 68 {
next = []int{location[0] + 1, location[1]}
out = location[0]+1 > n-1
return
}
if action == 85 {
next = []int{location[0] - 1, location[1]}
out = location[0]-1 < 0
return
}
return nil, true
}

5965. 相同元素的间隔之和

给你一个下标从 0 开始、由 n 个整数组成的数组 arr

arr 中两个元素的 间隔 定义为它们下标之间的 绝对差 。更正式地,arr[i]arr[j] 之间的间隔是 |i - j|

返回一个长度为 n 的数组 intervals ,其中 intervals[i]arr[i]arr 中每个相同元素(与 arr[i] 的值相同)的 间隔之和

注意:|x|x 的绝对值。

示例 1:

输入:arr = [2,1,3,1,2,3,3]
输出:[4,2,7,2,4,4,5]
解释:
- 下标 0 :另一个 2 在下标 4 ,|0 - 4| = 4
- 下标 1 :另一个 1 在下标 3 ,|1 - 3| = 2
- 下标 2 :另两个 3 在下标 5 和 6 ,|2 - 5| + |2 - 6| = 7
- 下标 3 :另一个 1 在下标 1 ,|3 - 1| = 2
- 下标 4 :另一个 2 在下标 0 ,|4 - 0| = 4
- 下标 5 :另两个 3 在下标 2 和 6 ,|5 - 2| + |5 - 6| = 4
- 下标 6 :另两个 3 在下标 2 和 5 ,|6 - 2| + |6 - 5| = 5

示例 2:

输入:arr = [10,5,10,10]
输出:[5,0,3,4]
解释:
- 下标 0 :另两个 10 在下标 2 和 3 ,|0 - 2| + |0 - 3| = 5
- 下标 1 :只有这一个 5 在数组中,所以到相同元素的间隔之和是 0
- 下标 2 :另两个 10 在下标 0 和 3 ,|2 - 0| + |2 - 3| = 3
- 下标 3 :另两个 10 在下标 0 和 2 ,|3 - 0| + |3 - 2| = 4

提示:

  • n == arr.length
  • 1 <= n <= 105
  • 1 <= arr[i] <= 105

提交

timeout: 测试用例中存在 100000 长度的数组 这样写会超时

func getDistances(arr []int) []int64 {
dic := make(map[int][]int)
for i, v := range arr {
if dic[v] != nil {
dic[v] = append(dic[v], i)
} else {
dic[v] = []int{i}
}
}
answer := make([]int64, len(arr))
for i, v := range arr {
sum := 0
for _, same := range dic[v] {

if same > i {
sum += same - i
} else {
sum += i - same
}
}
answer[i] = int64(sum)
}
return answer
}

optimize

func getDistances(arr []int) []int64 {
dic := make(map[int][]int)
for i, v := range arr {
if dic[v] != nil {
dic[v] = append(dic[v], i)
} else {
dic[v] = []int{i}
}
}
answer := make([]int64, len(arr))
for _, indexArr := range dic {
for i := range indexArr {
answer[indexArr[i]] = countSub(indexArr, i)
}
}
return answer
}

func countSub(arr []int, i int) int64 {
var sub int64 = 0
for _i := range arr {
if arr[_i] > arr[i] {
sub += int64(arr[_i] - arr[i])
} else {
sub += int64(arr[i] - arr[_i])
}
}
return sub
}

第二次循环所有改为循环 dic 仍然超时


第273场周赛