[AppleScript] 纯文本查看 复制代码
package bean;
public class ArrayTool { //声明一个类
private ArrayTool() {} //私有化构造函数
public static int[] getArray(int[] arr) { //声明一个公开的静态方法.定义其返回值类型,参数列表及方法名
int k = 0; //定义一个临时变量k并初始化
int[]array = new int[arr.length]; //定义一个临时int数组用于记录信息
array[0] = k; //初始化其第一个元素,因为该值在算法中是固定的,不需要动态获取
for (int i = 1;i < arr.length;i++) { //定义外层循环用于遍历arr
k++; //先对k进行自增,原因在下面代码中说明
for (int j = 0; j < i; j++) { //定义内层循环,用于进行比对.从前往后比对和从后往前比对,并不影响算法复杂性
if(arr[i] == arr[j]) { //当之前的元素中找到相同元素时
k--; //对k进行k--运算
break; //并跳出当前元素的比对工作,因为找到相同的,(在这里并不需要关心重复了几次)
} //算法步骤将在后面给出
} //接10,只是因为加法比减法简单,故用加不用减,将未注释中的--算法改为++算法.
array[i] = k; //将k的值赋给array[i]用于记录当前元素是第几个不重复的元素
} //很显然若array[i-1] == array[i],这一定说明arr[i]与之前的i个元素中的某一个重复了.
int[] result = new int[k+1]; //新建一个临时int数组用于返回不重复的值,因为k从0开始计数,所以是k+1个元素.
int n = 0; //新建一个临时变量用于记录录入了多少个不重复的元素
result[0] = arr[0]; //第一个值肯定不重复,因为其找不到值进行比对
for (int i = 1;i < arr.length;i++) { //继续定义循环用于遍历array1,录入result;
if (array[i] == array[i-1]) { //之前说过,当array[i-1] == array[i],这一定说明arr[i]与之前的i个元素中的某一个重复了.
continue; //所以跳过本次循环
}else { //否则
n++; //n++
result[n] = arr[i]; //将arr[i]的值赋给result[n]记录下第n+1个不重复的元素值
}
if (n == k) { //当n==k时,剩下的循环就不必进行了
break; //所以break跳出循环
} //注意不能漏大括号,若按照格式写时,右大括号不是阶梯状的,那么一定有大括号漏了
} //或者说错位了
return result; //将所得结果返回之后,算法结束
}
} //在不计算右大括号和空行的情况下算法实现加类的声明和构造使用代码25行
/*
算法1步骤
step 1:
得到需要进行除重的数组arr
step 2:
对arr进行遍历
step 3:
在遍历的同时将取得的元素与其之前的元素进行比对
step 4:
将比对的结果用一个同样长的int类型数组记录下来 int[] array 其所记录的值就是之后将会用到的索引
step 5:
记录方式如下:
将第一个不重复的元素的索引记为 0 ;
将第 i + 1 个不重复的元素的索引记为 i ;
任意一个重复的元素的索引值将会使用其前一个元素的索引值(注: 核心思想!!!!)即用前一个索引值对其赋值;
最后将array数组的最后一个元素记录的索引值取出并加1就是我们不重复元素的个数
注:在这里是不需要去考虑这个重复元素 (若命名为 S) 的前一个元素是否也是重复的.因为若其前一个元素(若命名为S-1)仍旧是重
复的,其索引值仍旧是继承至S-1的前一个元素(命名为S-2)的索引值,这时S的索引值是使用S-1的,还是使用S-2的,在结果上并没有任何区
别,在数据安全性方面没有任何问题,这种舍近求远 舍本逐末的方法(即将S-2的索引值赋值给S),是不可取的,是垃圾,用不客气的话说.同
样的思路,一种体现了智慧;而另一种则是体现了ZZ.
step 6:
建立一个新的数组,用于记录我们的结果 type[] result,,,,,,,,,arr是什么格式的数组,type[]就代表着什么格式的数组
step 7:
根据step 5的记录原理,对result[] 用for语句将arr[]中不重复的元素录入
step 8:
关于step 7何时结束的问题,若arr[]数组在某一项元素以后的元素都在之前的元素中出现了重复,即用array[]记录的索引值完全相同
且之后的索引值永远不再发生改变了.若还是让for循环继续进行,这种行为与step 5中使用S-2的索引值,在本质上没有区别,所以需要使用
if语句做出判断是否应当结束循环即28行中用与计数的n==k时,结束循环.
step 9:
返回结果,结束算法
另可以通过方法重载可以对不同类型的数组进行除重运算时间关系暂时未写.
by_czs
[b]*/[/b]