【LeetCode】统计一个数组中好对子的数目 Java 题解
题目描述
给你一个数组 nums ,数组中只包含非负整数。定义 rev(x) 的值为将整数 x 各个数字位反转得到的结果。比方说 rev(123) = 321 , rev(120) = 21 。我们称满足下面条件的下标对 (i, j) 是 好的 :
0 <= i < j < nums.lengthnums[i] + rev(nums[j]) == nums[j] + rev(nums[i])请你返回好下标对的数目。由于结果可能会很大,请将结果对 109 + 7 取余 后返回。
思路分析
今天的算法题目是数组处理题目,题目要求是比较清晰的。第一步,需要实现反转函数。第二步,题目给出了判断下标的对数公式,然后我们可以根据公式做出判断,需要注意的是,这里的数值可能比较大,因此我们需要对答案进行取模操作。
具体第一步,反转函数,我们需要可以理解为取出数位重新计算。首先取出 num 的最高位,就是返回值的最低位,依次计算。
第二步,题目给出了计算公式。我们首先可以使用暴力的方式求解,这个题目的数据集比较大,无法通过所有测试用例。
我们再次分析这个公式 nums[i] + rev(nums[j]) == nums[j] + rev(nums[i])。通过交换律,nums[i] - rev(nums[i]) == nums[j] - rev(nums[j]) 。这样转换之后,是不是和我们的两数之和题目很像呢?我们使用 hashmap 记录每一个 nums[i] - rev(nums[i]) 的值,提升计算效率。实现代码如下,供参考。
通过代码
总结
上述算法的时间复杂度是 O(n),空间复杂度是 O(n)
今天这个题目尝试的次数比较多,下次应该多加总结,找到问题在提交代码,提升效率。
坚持算法每日一题,加油!
版权声明: 本文为 InfoQ 作者【HQ数字卡】的原创文章。
原文链接:【http://xie.infoq.cn/article/c42a4ed98e61a6fb314b7895a】。文章转载请联系作者。
评论