在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