数组去重(不借助额外空间)

今天面试碰到了一个题目:给定排序数组,去除里面的重复元素,给出元素个数,并且数组的前几个元素都非空,空间为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));
        
    }

 

posted @ 2021-05-25 00:05  bloom_camellia  阅读(337)  评论(0编辑  收藏  举报