本帖最后由 无此姓名 于 2014-4-1 23:00 编辑
这是黑马基础测试里的一个题目,感觉有点意思,和大家讨论一下。
需求:数组去重复,例如: 原始数组是{4,2,4,6,1,2,4,7,8},得到结果{4,2,6,1,7,8}。
前提:在网上看到有其他办法,但目前我们课程刚进行到String类,很多知识都没学到,想到用“标志位计算元素个数”的办法。
问题:就目前我的知识水平(刚刚学完String类)不知道大家有什么好的解决办法没有。
我的代码如下
- package com.itheima;
- import java.util.Arrays;
- public class Test8 {
- /**
- *需求:数组去重复,例如: 原始数组是{4,2,4,6,1,2,4,7,8},得到结果{4,2,6,1,7,8}
- * @param args
- */
- public static void main(String[] args) {
- int arr[]={4,2,4,6,1,2,4,7,8};
- System.out.println(Arrays.toString(repeat(arr))); //将去重后数组打印出来
- }
-
- /*定义方法实现去重。
- * 思路:
- * 1、先确定去重后数组元素的个数count,定义一个boolean类型数组来给重复的元素做标志;
- * 2、定义元素个数为count的新数组arrNew,将所有不重复的元素存入数组中。
- * 3、将arrNew返回。
- * */
-
- public static int[] repeat(int [] arr){
- boolean flag[] = new boolean[arr.length];//定义一个和目标数组长度一样的boolean类型,此数组用作标示,用于获取不重复元素的个数的标志位
- for (int i = 0; i < flag.length; i++) {//遍历数组,查找重复的元素。循环结束后,重复的元素对应的标志位置都为true。
- if (flag[i]) //如果这个元素对应的标志位已被置为true,则返回循环继续检查下一个元素。
- continue;
- for (int j = i+1; j < flag.length; j++) { //后边元素和此位置上的元素比较,
- if (arr[j]==arr[i]) { //如果后边元素和前边元素相同,
- flag [j]=true; //则此重复元素对应的标志位置为true
- }
- }
- }
-
- int count=0; //计数器,记录不重复元素的个数
- for (int i = 0; i < flag.length; i++) { //算出不重复元素的个数,记为count,
- if (!flag[i]) { //标志位依然为false的对应元素即为不重复的元素
- count++;
- }
- }
-
- int index=0;
- int [] arrNew = new int [count]; //定义新数组,元素个数为count。
- for (int i = 0; i < arr.length; i++) { //将所有不重复的元素存入新数组中
- if (!flag[i]) {
- arrNew[index++]=arr[i];
- }
- }
-
- return arrNew; //返回数组
- }
- }
复制代码 |