数组去重(不借助额外空间)
今天面试碰到了一个题目:给定排序数组,去除里面的重复元素,给出元素个数,并且数组的前几个元素都非空,空间为O(1)。
如 Integer[] arr = {0, 0, 1, 1, 1, 2, 3, 3, 4, 5, 5}; 操做后应返回6,并且数组为[0, 1, 2, 3, 4, 5, null, null, null, null, null]
面试的时候,记事本写了一个贼复杂的各种判断,还是没有完全实现,主要是不能使用额外空间限制了很多想法。刚才又回想了一下这个问题,想到一种稍简洁的办法,记录一下,可能也有更简洁的,想到了再记录,也欢迎大家留言。
@Test public void test(){ Integer[] arr = {0, 0, 1, 1, 1, 2, 3, 3, 4, 5, 5}; //从后向前删除重复元素 for(int i = arr.length - 1; i > 0; i--){ if(arr[i] == arr[i-1]){ arr[i] = null; } } System.out.println("1--"+ Arrays.toString(arr)); //遍历交换,使非空元素在前 int n = 0; while(n < arr.length - 1){ for(int i = n; i < arr.length - 1; i++){ if(arr[i] == null){ arr[i] = arr[i+1]; arr[i+1] = null; } } n++; } System.out.println("2--"+ Arrays.toString(arr)); int count = 0; n = 0; while(n < arr.length - 1 && arr[n++] != null){ count++; } System.out.println("3--"+ Arrays.toString(arr)); System.out.println("总数--"+ count); }
输出:
1--[0, null, 1, null, null, 2, 3, null, 4, 5, null]
2--[0, 1, 2, 3, 4, 5, null, null, null, null, null]
3--[0, 1, 2, 3, 4, 5, null, null, null, null, null]
总数--6
还有就是想了一下,如果只是用来交换非空和空值的顺序,使所有空元素都在后面,可以借鉴一下快排的想法,但是这样元素顺序就没有了,也不知道有用没。
@Test public void test2(){ Integer[] arr = {0, 0, 1, 1, 1, 2, 3, 3, 4, 5, 5}; //从后向前删除重复元素 for(int i = arr.length - 1; i > 0; i--){ if(arr[i] == arr[i-1]){ arr[i] = null; } } System.out.println(Arrays.toString(arr)); //交换,使非空元素在前 int l = 0; int r = arr.length - 1; while(l < r){ while(arr[l] != null){ l++; } while(arr[r] == null){ r--; } if(l < r){ arr[l] = arr[r]; arr[r] = null; } } System.out.println(Arrays.toString(arr)); }
我向上天祈祷,愿你一切安好。