一、问题现象
int[] num1 = {2,0},num2 = {1};
i = 0,j=0,end=1;
while(j>=0){
// nums1[end--] = (i>=0 && nums2[j] > nums1[i])?nums2[j--]:nums1[i--]; // 有问题的代码 ①
nums1[end--] = (i>=0 && nums1[i] > nums2[j])?nums1[i--]:nums2[j--]; // ②
}
如果使用注释的代码行,会出现数组越界的异常报错;
二、问题原因分析
while循环中两行代码对比:
- 相同点
(1)两行代码的实现的功能其实是一样的;
(2)第一次循环后的i一定会变成-1; - 不同点
(1)第二次循环三目运算符的取值导致数组越界;
其实,仔细分析才深切体会到,三目运算的判断条件判断主体不同(> 运算符左边为主,右边为次),会直接影响后面 : 的选择,正是因为这点,i 变成-1后,括号中 (i>=0 && nums1[i] > nums2[j]) 中直接变成false,也就需要保证不能取mums1[i–];