はじめに
LeetCodeの問題「4Sum」の解説を読んで疑問を覚えたので調べた内容をメモ。
問題
整数の配列から2つの要素をピックアップして、2つの数字の合計値がターゲットとなる数字と一致した場合、2つの数字をリストに追加するという処理の部分。
(解説のコードとは少し変えてあります。)
int nums[] = [-2, -1, 0, 0, 1, 2];
int target = 3;
List<List<Integer>> res = new ArrayList<>();
int left = 0;
int right = nums.length - 1;
while (left < hi) {
int currSum = nums[left] + nums[right];
if (currSum < target || (left > start && nums[left] == nums[left - 1])) {
++left;
} else if (
currSum > target ||
(right < nums.length - 1 && nums[right] == nums[right + 1])
) {
--right;
} else {
res.add(Arrays.asList(nums[left++], nums[right--]));
}
}
以下の部分であれ??となった。
addするときにインクリメント(とデクリメント)しちゃったらダメじゃん?と。
res.add(Arrays.asList(nums[left++], nums[right--]));
なぜこうなるか
System.out.println(array[++index]);
上記のように ++
を先に書いた場合は、まずindexに1を加えてから値を与える。
一方で
System.out.println(array[index++]);
のように ++
を後に書いた場合は、まずindexの値を与えてからインクリメントする。
例)
int nums[] = [-2, -1, 0, 0, 1, 2];
int i = 0;
System.out.println(nums[++i]); // -> -1
// -> indexをまずインクリメントするのでnums[1] が出力される。
System.out.println(nums[i++]); // -> -2
// -> まずiの値を与えるので nums[0] が出力され、それからiをインクリメントする。
おわりに
5年近くやってて、ほんっとに知らなかった。ここで知れて良かった・・・