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


    今天面试碰到了一个题目:给定排序数组,去除里面的重复元素,给出元素个数,并且数组的前几个元素都非空,空间为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));
            
        }
    我向上天祈祷,愿你一切安好。
  • 相关阅读:
    with一个对象,自动触发__enter__方法
    SQLAlchemy-Utils
    SQLAlchemy
    wtforms
    Python数据库连接池DBUtils(基于pymysql模块连接数据库)
    VMWare安装linux centos,安装中文输入法
    HttpServletRequest和ServletRequest的区别
    Java序列化
    mybatis循环取序列,值相同问题处理
    利用jdk将wsdl生成java代码
  • 原文地址:https://www.cnblogs.com/moly/p/14806911.html
Copyright © 2020-2023  润新知