问题描述
在LeetCode刷每日一题,如下
3101. 交替子数组计数
给你一个二进制数组nums 。
如果一个子数组中 不存在 两个 相邻 元素的值 相同 的情况,我们称这样的子数组为 交替子数组 。
返回数组 nums 中交替子数组的数量。
我的解答如下:
public long countAlternatingSubarrays(int[] nums) {
// 计算下标为i的子数组的个数,知道如果nums[i]=nums[i-1],则个数为1,也就是nums[i]自己
// 如果nums[i]!=nums[i-1],则个数为nums[i-1]的个数+1
int sum = 0;
int cur = 0;
for (int i = 0; i < nums.length; i++) {
if (i > 0 && nums[i] != nums[i - 1]) {
cur++;
} else {
cur = 1;
}
sum += cur;
}
return sum;
}
运行时是对的,提交时通不过。
有一个测试用例输出是705082704,答案应该是5000050000 。
问题原因
仔细检查了很多遍,也没有发现问题,最后是将测试用例复制到编辑器中,发现了问题:5000050000 是int类型无法保存的。
函数返回的是long类型,因为int为自动转为long类型,因此没有报编译错误,同时在数字比较小时,运行时也不会报错。
问题解决
正确答案应该是:
public long countAlternatingSubarrays(int[] nums) {
// 计算下标为i的子数组的个数,知道如果nums[i]=nums[i-1],则个数为1,也就是nums[i]自己
// 如果nums[i]!=nums[i-1],则个数为nums[i-1]的个数+1
long sum = 0;
long cur = 0;
for (int i = 0; i < nums.length; i++) {
if (i > 0 && nums[i] != nums[i - 1]) {
cur++;
} else {
cur = 1;
}
sum += cur;
}
return sum;
}