Codingbat Array2 tenRun问题:代码运行逻辑的疑问
理解
tenRun函数的运行逻辑 先明确你的需求和疑惑:
给定数组中,每遇到一个10的倍数,将其之后所有值替换为该10的倍数,直到遇到下一个10的倍数。例如{2, 10, 3, 4, 20, 5}应输出{2, 10, 10, 10, 20, 20}。我无法理解以下代码为何能正确运行:我认为输入{1, 10, 2, 2}的输出应该是{1, 10, 10, 2},因为for循环应该只检测到一次10的倍数,后续不会再检测到,但实际并非如此。
你贴出的代码如下:
public int[] tenRun(int[] nums) { for (int i = 0; i < nums.length-1; i++) { if (nums[i] % 10 == 0) { if (nums[i+1] % 10 != 0) { nums[i+1] = nums[i]; } } } return nums; }
为什么你的预期和实际结果不符?
咱们拿你提到的输入{1, 10, 2, 2}一步步走循环,就能明白问题所在:
初始数组:[1, 10, 2, 2],数组长度为4,所以循环的i会取0、1、2(因为i < nums.length-1 → i < 3)
- 当i=0时:
nums[0] = 1,1不是10的倍数,跳过所有if逻辑,数组无变化。 - 当i=1时:
nums[1] = 10,是10的倍数;此时nums[2] = 2,不是10的倍数,所以把nums[2]改成10。现在数组变成[1, 10, 10, 2]。 - 当i=2时:重点来了!此时
nums[2]已经被改成10了(是10的倍数),进入第一个if;nums[3] = 2不是10的倍数,所以把nums[3]也改成10。最终数组变成[1, 10, 10, 10]。
你之前的误区是:以为循环只会检测原始数组里的10倍数,但实际上循环会遍历每一个元素——包括那些被修改后变成10倍数的元素,所以它能持续“接力”修改后面的元素,直到遇到下一个原生的10倍数。
再验证示例数组的运行过程
拿你给出的示例{2, 10, 3, 4, 20, 5}再走一遍,确认逻辑:
初始数组:[2, 10, 3, 4, 20, 5]
- i=0:2不是10倍数,跳过。
- i=1:10是10倍数,nums[2]=3→改成10,数组变为
[2,10,10,4,20,5]。 - i=2:nums[2]=10是10倍数,nums[3]=4→改成10,数组变为
[2,10,10,10,20,5]。 - i=3:nums[3]=10是10倍数,但nums[4]=20是10倍数,所以第二个if不触发,不修改。
- i=4:nums[4]=20是10倍数,nums[5]=5→改成20,最终数组
[2,10,10,10,20,20],完全符合需求。
总结这段代码的逻辑
它不是一次性定位一个10倍数然后批量修改后续元素,而是逐个相邻检查传递:
- 每遍历到一个位置i,如果当前元素是10的倍数,就把下一个非10倍数的元素改成当前值;
- 当被修改的元素成为10倍数后,轮到它作为i时,又会继续修改它的下一个元素,直到遇到原生的10倍数(此时不会修改,因为下一个元素本身就是10倍数)。
内容的提问来源于stack exchange,提问作者Kenny
相关产品推荐
相关产品推荐

