java - 在 Leetcode 中计数 Nice Pairs 给了我错误的结果
问题描述
我最近在 Leetcode 中遇到了一个有趣的问题。这是问题网址。
i
因此,简单来说,计算与 2 个索引和的以下条件匹配的对数j
。
nums[i] + rev(nums[j]) == nums[j] + rev(nums[i])
我认为的简单解决方案是保持整数的计数及其倒数并找到 NC2。
这是我的方法,
class Solution {
public int countNicePairs(int[] nums) {
int[] rev = new int[nums.length];
for(int i=0;i< nums.length;i++){
rev[i] = Integer.parseInt(new StringBuilder(String.valueOf(nums[i])).reverse().toString());
}
System.out.println(Arrays.toString(rev));
Map<Integer,Integer> map = new HashMap<>();
for(int i=0;i<nums.length;i++){
int diff = Math.abs(rev[i]-nums[i]);
map.put(diff,map.getOrDefault(diff,0)+1);
}
int mod = (int)(1e9 +7);
long op = 0;
for(int val: map.values()){
op +=((long)(val)*(long)(val-1)/(long)2);
op = op%mod;
}
return (int)(op%mod);
}
}
此代码在 4 个测试用例中失败。并且其中提到的示例粘贴在https://justpaste.it/2n1ka
My answer : 92976930
Expected answer : 92974217
如您所见,输入很大,我无法调试我的代码有什么问题。
解决方案
问题出在这一行:
int diff = Math.abs(rev[i]-nums[i]);
您假设差异中整数的符号无关紧要,但确实如此。例如:
[21,12]
在这里,这两个数字作为数组本身的元素都有它们的反面,并且它们不是很好的一对,因为(21 - 12) != (12 - 21)
. 请注意,符号在这里很重要,对此的答案是,0
但你的返回1
是不正确的。
解决方案:
只需删除绝对值检查。你的计算应该遵循nums[i] - rev(nums[i]) = nums[j] - rev(nums[j])
但你正在做相反的事情,比如将两边乘以-1
(这也可以)。所以,只要做
int diff = rev[i]-nums[i];
旁注:您可以通过在 for 循环迭代期间为每个元素本身计算来完全删除rev
数组。rev
推荐阅读
- typescript - 如何使用 Jest 在 Typescript 中模拟 URL 超时?
- ruby-on-rails - 干掉这个红宝石代码的最佳方法是什么?
- git - Git:如何拥有仅分叉的文件
- selenium - 使用 IE 11 的 Auth0/单唱 Selenium 登录问题
- matlab - 如何从 Matlab 中的函数中提取输出?
- javascript - 如何在three.js中并行使用相机上的视图偏移和缩放属性
- java - Java+Cucumber 执行错误(java.lang.ClassCastException: class io.cucumber.docstring.DocString cannot be cast to class java.lang.String)
- arrays - 在 MATLAB/Octave 中查找 N 维数组中的所有局部最小值
- arduino - 通过端口扩展器实现 I2C 总线的软件
- database - 如何构建数据库来存储不同类型的数据?