※状况概述: 最近在练习leetcode 的 removeElement
发现使用stream api 和 使用for loop 去指定元素 答案会不一样?
使用steam api 在函数里面有正确改成功 但是 在main 里面就不一样了
有点难以叙述,请直接看code
※程式码:
public class LC0027RemoveElement {
public static int removeElement(int[] nums, int val) {
List<Integer> intList = new ArrayList<Integer>(nums.length);
int count=0;
int length=nums.length;
for (int i : nums){
if(i==val) {
count++;
}
}
System.out.println("length: "+nums.length);
System.out.println("count: "+count);
for (int i : nums){
intList.add(i);
}
System.out.println("size: " + intList.size() );
intList.removeAll(Arrays.asList(val));
nums = intList.stream().mapToInt(i -> i).toArray();
System.out.println("size: " + intList.size() );
// for(int i=0;i< intList.size();i++) {
// nums[i]=intList.get(i);
// }
System.out.println("nums in function:"+ Arrays.toString(nums)
return length-count;
}
public static void main(String[] args) {
int [] nums= { 3, 1, 2, 3, 2 };
int val=3;
int answer;
answer=removeElement(nums ,val);
System.out.println(answer);
System.out.println("print nums in main "+ Arrays.toString(num
s)
}
}
结果如下:
注解掉for loop的版本
https://imgur.com/YlOHT1Y
没有注解调for loop的版本
https://imgur.com/mVzZBtl
我的思路是 先将 nums这个阵列里面的值都copy 到 arraylist里面
然后利用arraylist里面的方法将 val 都移除掉
移除完之后再产生 nums = intList.stream().mapToInt(i -> i).toArray();
问题是 nums在函数里面是有被更改的 为何在main里面没有被更改 ??
令人疑惑的另外一件事情是
如果将我注解的for loop 拿掉
这样函数里面印出来的 跟 main 里面去印 nums 都会一致
有点搞不太懂理由是为何