记一个刷题过程中遇到的溢出问题。

在做这道题的时候遇到一个与 long 类型有关的溢出错误。

原始代码如下

class Solution {
public int numberOfPairs(int[] nums) {
long res = 0;
int mod = (int)Math.pow(10, 9) + 7;
HashMap<Integer, Integer> map = new HashMap<>();
for(int i = 0; i < nums.length; i++){
int diff = cal(nums[i]);
map.put(diff, map.getOrDefault(diff, 0) + 1);
}
for(int v : map.values()){
res = (res + (v * (v - 1))/2) % mod;
}
return (int)(res % mod);
} private int cal(int num) {
return reverse(num) - num;
} private int reverse(int num){
StringBuilder str = new StringBuilder(String.valueOf(num));
str.reverse();
return Integer.parseInt(str.toString());
} }



最后一个测试用例无法通过,分析原因,始终是加法运算,最后却输出一个负数,应该是溢出了。

可能是这条语句导致了溢出
res = (res + (v * (v - 1))/2) % mod;
改为
res = (res + (long)(v * (v - 1))/2) % mod; 不行
改为
res = (res + (long)(v % mod * (v - 1) % mod)/2) % mod; 也不行
猜想可能 v * (v - 1) 溢出了
改为
res = (res + (long)((v/2) % mod * (v - 1) % mod)) % mod; 让 v 先除以 2,也不行。这里不行的原因是 v 有可能是奇数,比如 3,除以 2 就是 1 了,截断了,本来应该是1.5。而 v*(v - 1) 一定是个偶数。

最后发现问题
改为
res = (res + ((long)v * (v - 1))/2) % mod; 就通过了。

原因是(long)(v * (v - 1))/2) 中 v*(v-1)可能溢出,溢出的结果转为long,还是错误的。
因此要先将v转为long,这样一个long类型乘以一个int类型就会进行隐式转换,都转成long,long乘long就不会溢出了。

自动类型转换遵循下面的规则:

  1. 若参与运算的数据类型不同,则先转换成同一类型,然后进行运算。
  2. 转换按数据长度增加的方向进行,以保证精度不降低。例如int型和long型运算时,先把int量转成long型后再进行运算。

下图表示了类型自动转换的规则:

Java long类型转换易犯的错误的更多相关文章

  1. java代码书写易犯错误

    java代码书写易犯错误: 常见报错: 控制台报错: 找不到或无法加载主类 HelloWorld 原因: java.lang.NoClassDefFoundError: cn/itcast/day01 ...

  2. 十个JAVA程序员容易犯的错误

    十个JAVA程序员容易犯的错误 1. Array 转 ArrayList 一般开发者喜欢用: List<String> list = Arrays.asList(arr); Arrays. ...

  3. Python 字典一个易犯的错误

    一个易犯的错误,关于 Python 的传值(对于不可变量) 和 传引用(对于可变量),浅拷贝和深拷贝.废话不多说,看例子, 直接改变可变字典值,失败, >>> dic = dict. ...

  4. javascript中易犯的错误有哪些

    javascript中易犯的错误有哪些 一.总结 一句话总结: 比如循环中函数的使用 函数中this的指向谁(函数中this的使用) 变量的作用域 1.this.timer = setTimeout( ...

  5. Java开发经常容易犯的错误

    调用Set.addAll()方法时抛UnsupportedOperationException异常 上面的Set是Map中keySet的返回结果. 程序中这样两句代码运行时,抛UnsupportedO ...

  6. jquery初学者易犯的错误

    1 获取类或者对象的时候,忘记写“#”或者“.” 错误案例: $(document).ready(function(){ $("btn1").click(function(){ a ...

  7. java中自己常犯的错误汇总

    package debug; /** 1.定义一个公共的动物类,包含名字.年龄.颜色和吃饭东西方法 2.定义一个猫类,继承动物类,同时拥有玩游戏的本领 3.定义一个狗类,继承动物类,同时拥有看门的本领 ...

  8. js函数易犯的错误

    1.定义一个js函数时不能写在另一个函数里面. 2.定义一个打开网页自动执行的函数,一定要注意加载的顺序.如果是不是自动执行的,而是等页面加载完后事件触发的,那写在任何地方都没问题. 错误的:

  9. php一些易犯的错误

    1.mysql数据库字段是区分大小写的.字段在数组中要小写.(数据库字段UE_account) 错误的:

  10. iOS定位权限请求时易犯的错误小结

    起因 用户群反馈app可能请求了不合适的定位权限:始终定位. 看到这个截图,根据经验判断可能是后台定位功能导致可能不得不请求始终定位权限.再加上之前提交审核时,苹果要求在plist文件中新增NSLoc ...

随机推荐

  1. Scrapy 发送Request Payload

    Scrapy 发送Request Payload 首先要打开 F12 进入调试模式 然后 查看是用什么方法获取的 如果是Json: 1. json.dumps 转化成Json yield Reques ...

  2. 用 VS Code 搞 Qt6:让信号和槽自动建立连接

    Qt 具备让某个对象的信号与符合要求的槽函数自动建立连接.弄起来也很简单,只要调用这个静态方法即可: QMetaObject::connectSlotsByName(...); connectSlot ...

  3. Archlinux配置fcitx5

    fcitx5--Linux中最好用的中文输入法 ArchLinux配置fcitx5 输入法 本文基于archlinux + dwm.其他的桌面环境以及窗口管理器,配置选项差不多. 安装基础包 fcit ...

  4. .NET 7.0 重磅发布及资源汇总

    2022-11-8 .NET 7.0 作为微软的开源跨平台开发平台正式发布.微软在公告中表示.NET 7为您的应用程序带来了C# 11 / F# 7,.NET MAUI,ASP.NET Core/Bl ...

  5. elasticsearch聚合之bucket terms聚合

    目录 1. 背景 2. 前置条件 2.1 创建索引 2.2 准备数据 3. 各种聚合 3.1 统计人数最多的2个省 3.1.1 dsl 3.1.2 运行结果 3.2 统计人数最少的2个省 3.2.1 ...

  6. Vue3 企业级优雅实战 - 组件库框架 - 6 搭建example环境

    该系列已更新文章: 分享一个实用的 vite + vue3 组件库脚手架工具,提升开发效率 开箱即用 yyg-cli 脚手架:快速创建 vue3 组件库和vue3 全家桶项目 Vue3 企业级优雅实战 ...

  7. SPPS完整版下载安装教程【博主亲测】

    SPSS全称Statistical Product and Service Solutions,是一款优秀的数据分析软件,旨在为用户提供专业的统计产品与服务解决方案.SPSS面向行业应用人员所设,被广 ...

  8. 深入理解Golang 闭包,直通面试

    大家好 今天为大家讲解的面试专题是: 闭包. 定义 闭包在计算机科学中的定义是:在函数内部引用了函数内部变量的函数. 看完定义后,我陷入了沉思...确实,如果之前没有接触过闭包或者对闭包不理解的话,这 ...

  9. ZWS物联网云平台为电器设备智能化,提升产品竞争力

    从目前的消费趋势来看,家居电器设备的消费发力点在于年轻人.他们基本由"80"."90后"组成,对于消费理念更加的新颖,对于新产品与新观念更加容易接受.不过相对的 ...

  10. 读 RocketMQ 源码,学习并发编程三大神器

    笔者是 RocketMQ 的忠实粉丝,在阅读源码的过程中,学习到了很多编程技巧. 这篇文章,笔者结合 RocketMQ 源码,分享并发编程三大神器的相关知识点. 1 CountDownLatch 实现 ...