在leetcode做算法题,挺简单的一个数组题,我的思路是对原数组进行递增排序形成一个新数组,然后比较原数组和新数组各个位置对应的元素有几个不同,下面是一开始写的算法,执行结果有问题,后来就输出了数组看了一下,发现 heights数组和target数组是一样的了,代码中数组的复制是有问题的
public int heightChecker(int[] heights) { int count= 0; int[] target = new int[heights.length]; target = heights; for(int i=0;i<target.length-1;i++){ for(int j=i+1;j<target.length;j++){ if(target[i] > target[j]){ int temp = target[j]; target[j] = target[i]; target[i] = temp; } } } for(int i=0;i<heights.length;i++){ if(heights[i] != target[i]){ count++; } } return count; }后来修改代码如下,执行成功
public int heightChecker(int[] heights) { int count = 0; int[] target = heights.clone(); Arrays.sort(target); for(int i=0;i<heights.length;i++){ if(heights[i]!=target[i]) count++; } return count; }经过百度和看评论中的解析,找到了数组复制的一些结论如下 1、等号复制后修改原数组后会影响另一个数组 2、clone复制,对于数组本身而言,它的元素是引用类型(字符串除外)的时候,本来数组每个元素中保存的就是对象的引用,所以,拷贝过来的数组自然而言也是对象的引用,所以对于数组对象元素而言,它又是浅拷贝; 3、clone复制,对于引用类型(字符串除外),改变其中一个中的值,会影响另外一个值,相当于“浅拷贝”; 4、clone复制,对于值类型、字符串,改变其中一个中的值,不会影响另外一个值,相当于“深拷贝”; 参考文章:https://www.cnblogs.com/zhuanjiao/p/11874784.html