Nested array references
int[] a = new int[] {9, 8, 3, 1, 5, 4};
for (int i = 0; i < a.length; i++){
if (a[i] % 2 == 0)
a[i] += 1;
else if(a[i] < a.length)
a[i] += a[a[i]];
}
|i | a[i] old | a[i] % 2 | a[i] < a.length | a[a[i]] | a[i] new |
|--|----------|----------|-----------------|---------|----------|
|0 | 9 | - | - | NaN | 9 |
|1 | 8 | + | - | NaN | 9 |
|2 | 3 | - | + | 1 | 4 |
|3 | 1 | - | + | 9 | 10 |
|4 | 5 | - | + | 4 | 9 |
|5 | 4 | + | - | 9 | 5 |
// a = {9, 9, 4, 10, 9, 5};
I thought that
a[3]
would equal1
That's correct, at step 3
, a[3] = 1
and then
a[1]
would equal8
That's not correct, because at step 1
it was incremented to 9
Note the first condition - if (a[i] % 2 == 0) {a[i] += 1;}
- this causes even values to be incremented. Therefore a[1]
is incremented from 8
to 9
.
Now, when i==3
, a[a[i]]
is evaluated to a[1]
which is equal to 9
. Then you are adding it to the original value of a[3]
(note the operator is +=
, not =
), so a[3]
becomes 1 + 9
, which is 10
.
Its okey.
Best way to see what you are doing is debuggin
(painting in this case)
your code:
int[] a = new int[] {9, 8, 3, 1, 5, 4};
for (int i = 0; i < a.length; i++){
if (a[i] % 2 == 0){
System.out.printf(a[i]);
a[i] += 1;
System.out.printf(a[i]);
}else if(a[i] < a.length){
System.out.printf(a[i]);
a[i] += a[a[i]];
System.out.printf(a[i]);
}
And you will see more clearly.Sometimes its better to face the wall by ourselves because one best practices is learn about you. Good luck!.