一、数组分组判断的循环条件(核心:避免下标越界)
1. 核心规则
循环条件 =j < 数组长度(len) - (每组元素个数 - 1)→ 本质:保证「分组的最后一个元素下标 < 数组长度」,不会越界。
2. 举例验证(数组[1,2,3,4],len=4)
| 分组场景 | 每组元素数 | 循环条件 | 有效 j 值 | 对应分组 | 说明(为什么不越界) |
|---|---|---|---|---|---|
| 单个元素判断(无分组) | 1 | j < 4(len) | 0,1,2,3 | [1]、[2]、[3]、[4] | 单个元素无需预留位置 |
| 2 个元素一组(相邻两位) | 2 | j < 3(len-1) | 0,1,2 | [1,2]、[2,3]、[3,4] | 最后一组 j=2,j+1=3 <4 |
| 3 个元素一组(连续三位) | 3 | j < 2(len-2) | 0,1 | [1,2,3]、[2,3,4] | 最后一组 j=1,j+2=3 <4 |
| 4 个元素一组(连续四位) | 4 | j < 1(len-3) | 0 | [1,2,3,4] | 最后一组 j=0,j+3=3 <4 |
3. 记忆口诀
分组几元素,在for遍历中的范围条件就是i < 下标最大值 -(几 - 1);单个不用减,越界不出现。
例如:[1,2,3]
下标最大值 = 2
2个元素一组
所以遍历范围条件:i < 2 - 1
数组下标方位判断
下标方位的本质 =数组里的元素是 “从数字的哪一端开始存的”,数组只分两种存储方式:反向存储(int型)、正向存储(String型)。
第一步:先搞懂 “反向存储”
1. 反向存储怎么来?(操作步骤,看一遍就会)
拆数字时用temp % 10取个位(最右边),再用temp /= 10取十位、百位… 把取到的数依次存进数组。→ 简单说:先存数字的 “最右边位”,再存往左的位。
2. 下标方位(用 314、5342 两个例子,奇偶都覆盖)
j为当前遍历数值的下标
| 数字 | 反向存储数组(arr) | arr[j](j=0) | arr[j+1](j=0) | arr[j+2](j=0) | arr [j+3](j=0,仅 5342) |
|---|---|---|---|---|---|
| 314(3 位) | [4,1,3] | 4(个位,最右) | 1(十位,中间) | 3(百位,最左) | - |
| 5342(4 位) | [2,4,3,5] | 2(个位,最右) | 4(十位,右中) | 3(百位,左中) | 5(千位,最左) |
3. 反向存储口诀
j 是右,+1 左一步,+2 左两步(j 对应数字最右边位,j+1 是数字里往左挪一位,j+2 再往左挪一位)
第二步:正向存储
1. 正向存储怎么来?
拆数字时先存最高位(最左边),再存往右的位(比如 314 先存 3,再存 1,最后存 4)。→ 简单说:先存数字的 “最左边位”,再存往右的位。
2. 下标方位(同样用 314、5342)
| 数字 | 正向存储数组(arr) | arr[j](j=0) | arr[j+1](j=0) | arr[j+2](j=0) | arr [j+3](j=0,仅 5342) |
|---|---|---|---|---|---|
| 314(3 位) | [3,1,4] | 3(百位,最左) | 1(十位,中间) | 4(个位,最右) | - |
| 5342(4 位) | [5,3,4,2] | 5(千位,最左) | 3(百位,左中) | 4(十位,右中) | 2(个位,最右) |
3. 正向存储口诀(反向口诀反过来就行)
j 是左,+1 右一步,+2 右两步