
2026-04-14:镜像对之间最小绝对距离。用go语言,给定一个整数数组 nums。如果存在两个下标 (i, j) 满足:
1.0 <= i < j < nums.length
2.把 nums[i] 的数字倒序后得到的数(倒序会自动忽略前导零),等于 nums[j]
则称 (i, j) 为“镜像对”。
对每个镜像对计算下标差的绝对值 abs(i - j),要求返回所有镜像对中最小的 abs(i - j)。
若数组中不存在任何镜像对,则返回 -1。
1 <= nums.length <= 100000。
1 <= nums[i] <= 1000000000。
输入: nums = [12,21,45,33,54]。
输出: 1。
解释:
镜像对为:
(0, 1),因为 reverse(nums[0]) = reverse(12) = 21 = nums[1],绝对距离为 abs(0 - 1) = 1。
(2, 4),因为 reverse(nums[2]) = reverse(45) = 54 = nums[4],绝对距离为 abs(2 - 4) = 2。
所有镜像对中的最小绝对距离是 1。
题目来自力扣3761。
我们从数组第一个元素开始,依次遍历每一个元素,执行查询匹配 → 记录反转值两个核心操作:
21: 0 存入哈希表。
哈希表状态:{21:0}
最小距离:仍为初始值(无镜像对)21:0,匹配成功!12: 1 存入哈希表(覆盖旧值)。
哈希表状态:{21:0, 12:1}
最小距离:154: 2 存入哈希表。
哈希表状态:{21:0, 12:1, 54:2}
最小距离:133: 3 存入哈希表。
哈希表状态:{21:0, 12:1, 54:2, 33:3}
最小距离:154:2,匹配成功!45: 4 存入哈希表。
哈希表状态:{21:0, 12:1, 54:2, 33:3, 45:4}
最小距离:1n 是数组的长度(最多 100000);d 是单个数字的最大位数(题目中数字最大为 10亿,最多 10 位,是固定常数);.
package main
import (
"fmt"
)
func minMirrorPairDistance(nums []int)int {
reverseNum := func(x int)int {
y := 0
for x > 0 {
y = y*10 + x%10
x /= 10
}
return y
}
prev := make(map[int]int)
n := len(nums)
ans := n + 1
for i, x := range nums {
if idx, exists := prev[x]; exists {
if i-idx < ans {
ans = i - idx
}
}
prev[reverseNum(x)] = i
}
if ans == n+1 {
return-1
}
return ans
}
func main() {
nums := []int{12, 21, 45, 33, 54}
result := minMirrorPairDistance(nums)
fmt.Println(result)
}

.
# -*-coding:utf-8-*-
def min_mirror_pair_distance(nums):
def reverse_num(x):
y = 0
while x > 0:
y = y * 10 + x % 10
x //= 10
return y
prev = {}
n = len(nums)
ans = n + 1
for i, x in enumerate(nums):
if x in prev:
if i - prev[x] < ans:
ans = i - prev[x]
prev[reverse_num(x)] = i
return-1if ans == n + 1else ans
def main():
nums = [12, 21, 45, 33, 54]
result = min_mirror_pair_distance(nums)
print(result)
if __name__ == "__main__":
main()
.
#include <iostream>
#include <vector>
#include <unordered_map>
#include <algorithm>
using namespace std;
int minMirrorPairDistance(vector<int>& nums) {
auto reverseNum = [](int x) -> int {
int y = 0;
while (x > 0) {
y = y * 10 + x % 10;
x /= 10;
}
return y;
};
unordered_map<int, int> prev;
int n = nums.size();
int ans = n + 1;
for (int i = 0; i < n; i++) {
int x = nums[i];
if (prev.find(x) != prev.end()) {
int idx = prev[x];
if (i - idx < ans) {
ans = i - idx;
}
}
prev[reverseNum(x)] = i;
}
if (ans == n + 1) {
return-1;
}
return ans;
}
int main() {
vector<int> nums = {12, 21, 45, 33, 54};
int result = minMirrorPairDistance(nums);
cout << result << endl;
return0;
}
