「最通俗易懂」的java数组去重(其他语言通用)

发布于:2023-01-14 ⋅ 阅读:(488) ⋅ 点赞:(0)

前言

demo1最简单,是正常的小白思路,yyds.

demo2在demo1的基础上稍微变了一下。

demo1与demo2针对各种数组【有序or无序】

demo3只针对有序数组,但是从时间复杂度和空间复杂度来说效率都是最高的,yyds,若数组无序可先排序。


1.demo1

* 难度:简单
* 实现思路:采用双层循环进行遍历,当外层循环[i]与内层循环[j]数据相等时,
* 开始从内层循环当前下标处[j],将之后的数据依次向前覆盖,同时长度[length]减一,达到删除最后一个元素的效果

代码如下(示例):

public int[] demo1(int[] array){
        int length = array.length;
        //此处为length-1,因为最后一个元素再没有可比项,且可避免内层循环j的下标越界问题
        for (int i = 0;i < length-1; i++){
            for (int j = i+1;j < length; j++){
                if (array[i] == array[j]){
                    //数组前移
                    for (int k = j;k < length; k++){
                        array[k-1] = array[k];
//
                    }
                    //排除前移后的元素与当前元素相等而忽略的问题
                    j--;
                    length--;
                }
            }
        }
        int[] arr = Arrays.copyOf(array,length);
        return arr;
    }

2.demo2

* 难度:简单
* 实现思路:采用双层循环进行遍历,当外层循环[i]与内层循环[j]数据相等时,
* 将数组最后一个元素赋值给下标为[j]元素,达到替换的效果,同时长度[length]减一,达到删除最后一个元素的效果

代码如下(示例):

public int[] demo2(int[] array){
    int length = array.length;
    for (int i = 0;i < length-1; i++){
        for (int j = i+1;j < length; j++){
            if (array[i] == array[j]){
                array[j] = array[length-1];
                j--;
                length--;
            }
        }
    }
    int[] arr = Arrays.copyOf(array,length);
    return arr;
}

2.demo3

* 难度:中等
* 实现思路:采用while循环,如果下标front与rear出元素不相等,则front++,再进行替换,
* 反之,rear继续后移

代码如下(示例):

public int[] demo3(int[] array){
    int length = array.length;
    int count = 0;
    int front = 0,rear = 1;
    while(rear < length){
        if (array[front] != array[rear]){
            front++;
            array[front] = array[rear];
            count++;
        }
        rear++;
    }
    int[] arr = Arrays.copyOf(array,length-count);
    return arr;
}

 


网站公告

今日签到

点亮在社区的每一天
去签到