前言
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; }