3153. 所有数对中数位不同之和(拆位算贡献+一次遍历)
https://leetcode.cn/problems/sum-of-digit-differences-of-all-pairs/description/
- 所有数对中数位不同之和
车尔尼有一个数组 nums ,它只包含 正 整数,所有正整数的数位长度都 相同 。
两个整数的 数位不同 指的是两个整数 相同 位置上不同数字的数目。
请车尔尼返回 nums 中 所有 整数对里,数位不同之和。
示例 1:
输入:nums = [13,23,12]
输出:4
解释:
计算过程如下:
13 和 23 的数位不同为 1 。
13 和 12 的数位不同为 1 。
23 和 12 的数位不同为 2 。
所以所有整数数对的数位不同之和为 1 + 1 + 2 = 4 。
示例 2:
输入:nums = [10,10,10,10]
输出:0
解释:
数组中所有整数都相同,所以所有整数数对的数位不同之和为 0 。
提示:
\(2 <= nums.length <= 10^5\)
\(1 <= nums[i] < 10^9\)
nums 中的整数都有相同的数位长度。
按位数,逐个实现,乘法原理相乘。
就是对于每个位算贡献。比如说[13,23,12]
先算第一位[1,2,1],这时候我们用个数组cnt[9]将其储存起来,这时候cnt[1]=2,cnt[2]=1,然后我们两层for循环算贡献比如说对于1这个位置上的贡献就是cnt[1]*sum(cnt[2]+cnt[3]+cnt[4]...+cnt[9])
然后再算第二位[3,3,2]这个贡献。
class Solution {
public:
long long sumDigitDifferences(vector<int>& nums) {
int n=nums.size();
long long int ans=0;
while(nums[0]){
vector<int>v(11);
for(int i=0;i<n;i++){
v[nums[i]%10]++;
nums[i]/=10;
}
// for(int i=0;i<=9;i++){
// cout<<v[i]<<" ";
// }
// cout<<endl;
for(int i=0;i<=9;i++){
long long int res=0;
for(int j=i+1;j<=9;j++){
res+=v[j];
}
ans=(ans+v[i]*res);
}
}
return ans;
}
};