List<Long>转int丢失精度:动态规划代码报错求助
解决long转int的类型不兼容问题
看起来你遇到的问题是数组索引的类型不匹配,编译器报错的核心原因是:你用了long类型的变量作为int类型的数组索引,Java不允许隐式地把long转成int(因为可能丢失精度)。咱们一步步拆解问题:
错误根源分析
你的代码里有两个关键问题:
- 内层循环的
i是long类型,但dp数组的长度是n+1(n是int),数组索引必须是int类型。当你写dp[i]或者dp[i - coin]时,i和i-coin都是long,编译器认为这是“可能损失精度的转换”,所以报错。 coin是Long类型,和long类型的i比较没问题,但计算索引时依然会产生long类型的结果,无法直接作为数组索引。
修复方案
因为n是int类型,内层循环的i取值范围是1到n,完全在int的范围内,所以直接把i改成int类型就解决了大部分问题。另外,当i >= coin时,coin的数值必然小于等于i(也就是小于等于n,int范围),所以可以安全地处理coin的类型转换:
修改后的代码如下:
public static long count(int n, List<Long> c) { long[] dp = new long[n + 1]; dp[0] = 1; for (long coin : c) { // 把coin转成int,因为当i >= coin时,coin <= i <=n(int范围),不会溢出 int coinInt = coin.intValue(); // 内层循环的i改成int类型 for (int i = 1; i <= n; i++) { if (i >= coinInt) { dp[i] += dp[i - coinInt]; } } } return dp[n]; }
额外说明
如果担心coin的数值可能超过int的范围(虽然题目里n是int,超过的话i >= coin永远不成立,不会进入分支),也可以用另一种方式处理,不需要提前转coin,而是在计算索引时强制转换:
public static long count(int n, List<Long> c) { long[] dp = new long[n + 1]; dp[0] = 1; for (long coin : c) { for (int i = 1; i <= n; i++) { if ((long)i >= coin) { // 因为i >= coin,所以i - coin是非负的,且数值在int范围内,强制转换安全 dp[i] += dp[(int)(i - coin)]; } } } return dp[n]; }
两种方式都能解决你的报错问题,第一种更直观,第二种避免了提前转换的步骤,你可以根据习惯选择。
内容的提问来源于stack exchange,提问作者d.r.
相关产品推荐
相关产品推荐

