1 题目:统计近似相等数对 I
官方标定难度:中
给你一个正整数数组 nums 。
如果我们执行以下操作 至多一次 可以让两个整数 x 和 y 相等,那么我们称这个数对是 近似相等 的:
选择 x 或者 y 之一,将这个数字中的两个数位交换。
请你返回 nums 中,下标 i 和 j 满足 i < j 且 nums[i] 和 nums[j] 近似相等 的数对数目。
注意 ,执行操作后一个整数可以有前导 0 。
示例 1:
输入:nums = [3,12,30,17,21]
输出:2
解释:
近似相等数对包括:
3 和 30 。交换 30 中的数位 3 和 0 ,得到 3 。
12 和 21 。交换12 中的数位 1 和 2 ,得到 21 。
示例 2:
输入:nums = [1,1,1,1,1]
输出:10
解释:
数组中的任意两个元素都是近似相等的。
示例 3:
输入:nums = [123,231]
输出:0
解释:
我们无法通过交换 123 或者 231 中的两个数位得到另一个数。
提示:
2 <= nums.length <= 100
1
<
=
n
u
m
s
[
i
]
<
=
1
0
6
1 <= nums[i] <= 10^6
1<=nums[i]<=106
2 solution
直接遍历每两个数,看是否满足条件即可
代码
class Solution {
public:
int countPairs(vector<int> &nums) {
int cnt = 0;
for (int i = 0; i < nums.size(); i++) {
for (int j = i + 1; j < nums.size(); j++) {
int x = nums[i], y = nums[j];
bool flag = true;
int d[2], z = 0;
for (; x | y; x /= 10, y /= 10) {
if (x % 10 != y % 10) {
if (z == 0) {
d[0] = x % 10;
d[1] = y % 10;
} else if (z == 1) {
if (x % 10 != d[1] || y % 10 != d[0]) {
flag = false;
break;
}
} else {
flag = false;
break;
}
z++;
}
}
if(flag && z != 1) cnt++;
}
}
return cnt;
}
};