当前位置:网站首页>删除数组中的重复项(保留最后一次出现的重复元素并保证数组的原有顺序)

删除数组中的重复项(保留最后一次出现的重复元素并保证数组的原有顺序)

2022-07-22 20:30:00 斯沃福德

链接
第21题;

在这里插入图片描述

方法一:栈

逆向遍历,遍历时用contain方法判断是否已存在;(Stack继承于Vector类;Vector实现了Iterable和Collection接口)
接收再弹出给新的数组,最后返回新数组;
结果:通过6/8,运行超时

    public int[] removeDuplicate (int[] array) {
    
        // 暴力
        //最后一次出现,那就逆向遍历
        Stack<Integer> s=new Stack<>();
        for(int i=array.length-1;i>=0;i--){
    
            if(!s.contains(array[i])){
    
                s.push(array[i]);
            }
        }
        //放入新数组
        int n=s.size();
        int[] r=new int[n];
        //弹栈,正好顺序颠倒过来
        for(int j=0;j<n;j++){
    
            r[j]=s.pop();
        }
        return r;
    }

方法二:Set判断是否重复 + 快慢指针

先逆序遍历,使用Set判断是否重复,重复就置为0;
使用快慢指针删除0;
将长度为slow的所有元素放至新数组并返回;

public int[] removeDuplicate (int[] array) {
    
        int n=array.length;
        Set<Integer>  s=new HashSet<>();
        // 倒序遍历,将重复的置为0
        for(int i=n-1;i>=0;i--){
    
            if(s.contains(array[i])){
    
               array[i]=0;
            }else{
    
               s.add(array[i]);
            }
        }

        // 快慢指针删除数组中的0
        int slow=0;
        int fast=0;
        while(fast<n){
    
            if(array[fast]==0){
    
                fast++;
            }else{
    
                array[slow]=array[fast];
                slow++;
                fast++;
            }
        }

        //0~slow移到新数组
        int[] r=new int[slow];
        for(int i=0;i<slow;i++){
    
            r[i]=array[i];
        }
        return r;
    }

结果:通过6/8

原网站

版权声明
本文为[斯沃福德]所创,转载请带上原文链接,感谢
https://blog.csdn.net/Swofford/article/details/125938196