如何去除有序数组中的重复元素

题目要求:输入一个有序的数组,你需要原地删除重复的元素,使得每个元素只能出现一次,返回去重后新数组的长度

题目分析:原地删除,即不可以创建新的辅助数组,那么需要在原数组上修改解决。

这种一般采用双指针技巧

即:如果是普通数组,使用两个指针slow和fast,fast负责网后遍历,如果发现数组元素不同,则把slow下标值对应的值替换为fast下标值对应的值,则在原数组上完成保存不重复值的操作,如果元素重复,则fast前进,而slow不动,则最终fast遍历到末尾时,slow下标值对应的所有元素已经是不重复的有序数组元素了

/**
 * 有序数组或者链表,通过两个指针方式去重数据,统计去重后数组个数
 */
public class ArraysTest {
    
    public static void main(String[] args) {
        int [] arrays = new int[7];
        arrays[0] = 0;
        arrays[1] = 1;
        arrays[2] = 1;
        arrays[3] = 2;
        arrays[4] = 3;
        arrays[5] = 3;
        arrays[6] = 4;
        System.out.println(removeDuplicates(arrays));
    }

    public static int removeDuplicates(int[] nums) {
        int slow = 0;
        int fast = 1;
        int length = nums.length;
        while (fast < length) {
            if(nums[slow] != nums[fast]){
                slow++;
                nums[slow] = nums[fast];
            }
            fast++;
        }
        return slow+1;
    }
}

扩展问题,如果是有序链表呢,方式一样处理,代码如下

/**
 * 有序数组或者链表,通过两个指针方式去重数据,统计去重后数组个数
 */
public class LinkedArraysTest {


    public static void main(String[] args) {

        LinkedList linkedList = new LinkedList();
        linkedList.add(new Node(0));
        linkedList.add(new Node(1));
        linkedList.add(new Node(1));
        linkedList.add(new Node(2));
        linkedList.add(new Node(3));
        linkedList.add(new Node(4));
        linkedList.add(new Node(4));
        Node head = removeDulplicated(linkedList);
        int count = 0;
        while (head !=null){
            count++;
            head = head.next;
        }
        System.out.println(count);
    }

    public static Node removeDulplicated(LinkedList linkedList) {

        Node slow = linkedList.head;
        Node fast = linkedList.head.next;
        while (null != fast){
            if(slow.data != fast.data){
                slow.next = fast;
                slow = slow.next;
            }
            fast = fast.next;
        }
        slow.next =null;
        return linkedList.head;
    }

    public static class Node{
        int data;
        Node next;

        public Node(int data) {
            this.data = data;
        }

    }

    public static class LinkedList{
        Node head;

        public void add(Node node){
            if(null == head){
                head = node;
            }else{
                Node current = head;
                while (current.next != null){
                    current = current.next;
                }
                current.next = node;
            }
        }
    }

}

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值