//计算数组中,求绝对值后,不重复的数字个数
/* 例如:
数组:1,2,2,3,4,5,6,-6,-3
输出:6    下面是我写的菜菜代码,用了两种方法,第一种简单的嵌套循环,     第二种,跟上次一个帖子学的,用第一个数组的元素做下标。不过,数组元素没说范围,所以健壮性不好
*/
import java.lang.Math;public class CountAbs{

public static void main(String args[]){
int [] array = {1,3,3,4,-3,-5,3,5,6,6,6,0,0};
int count=0;

for(int i=0;i<array.length;i++){
if(array[i] == 0){
count =1;
break;
}
}
for(int i=0;i<array.length;i++){

for(int j=i+1; j<array.length;j++){
if(array[i] == Math.abs(array[j])){
array[j] = 0;
}
}
if(array[i]!= 0){
count++;
}
}

System.out.println(count);

}
}
import java.lang.Math;public class CountAbs2{

public static void main(String args[]){
int [] array = {1,3,3,4,-3,-5,3,5,6,6,6,0,2,0};
int [] arr = new int[100];
int count=0;

for(int i=0;i<array.length;i++){
arr[Math.abs(array[i])]++;
}
for(int i=0;i<arr.length;i++){
if(arr[i]!=0){
count++;
}
}
System.out.println(count);
//System.out.println(Integer.bitCount(Integer.MAX_VALUE));
}
}

解决方案 »

  1.   

    楼主的算法是很好的。
    可以改进的一点是:不必把0单独考虑。
    当一个元素和前面的重复的时候,把它赋值为负数(比如-1)就好了。
    反正一个数的绝对值永远是大于等于0的。
    最后统计的时候把负数忽略掉……
    当然,用Set做也是可以的,不过其时间效率和空间效率未必好,只是代码量看起来短一些。public static int getNoRepeatCount( int[] array ) {
        Set<Integer> noRepeat = new TreeSet<Integer>();
        for ( int element: array ) {
    if ( element < 0 ) {
        noRepeat.add( new Integer(-element) );
            } else {
        noRepeat.add( new Integer(element) );
            }
        }
        return noRepeat.size();
    }
      

  2.   

    感觉楼主的第二种方法,需要开辟的额外空间太大了。
    万一数组中有10,0000这样的元素,岂不是要新建一个int[100000]……
      

  3.   

    用HashSet,很简单:
            int[] data = new int[] {1, 2, 2, 3, 4, 5, 6, -6, -3};
            Set<Integer> set = new HashSet<Integer>();
            for (int i : data)
            {
                set.add(Math.abs(i));
            }        
            System.out.println(set.size());
      

  4.   

    个人认为是hash的问题 用hashmap
      

  5.   


    import java.util.regex.Matcher;
    import java.util.regex.Pattern;public class CountAbs{
        
        public static void main(String args[]){
    int[] array = new int[]{
    1,3,3,4,-3,-5,3,5,6,6,6,0,0
    };
            int count = count(array);
    System.out.println("Totla : " + count);
        } public static int count(int[] array){
    if(array == null){
    throw new IllegalArgumentException("int[] array == null");
    } StringBuffer sb = new StringBuffer(array[0] + "");
    for(int i = 1; i < array.length ; i ++){
    sb.append(","+Math.abs(array[i]));
    } String content = sb.toString(); //content = "1,3,4,3,5,3,5,6,0";
    String regex = "^(\\d+)((,\\d+)*(,\\d+)*)(,\\1|\\3)((,\\d+)*)$";
    Pattern pattern = Pattern.compile(regex);
    Matcher matcher = pattern.matcher(content);

    System.out.println("原来数组: " + content.replaceAll("," , " "));

    while(matcher.matches()){
    content = content.replaceAll(regex,"$1$2$6");
    //System.out.println(content);
    matcher = pattern.matcher(content);
    }

    System.out.println("调整后数组: " + content.replaceAll(","," "));

    String[] sa = content.split(",");
    return sa.length;
    }
    }可以用正则,但这个的速度可能也不是最快的!
      

  6.   

    改良版//计算数组中,求绝对值后,不重复的数字个数
    /* 例如:
    数组:1,2,2,3,4,5,6,-6,-3
    输出:6
    */import java.util.regex.Matcher;
    import java.util.regex.Pattern;
    import java.util.Arrays;
    import static java.lang.Math.abs;public class Test{
    public static void main(String[] args){
    int[] array = {1,2,2,3,4,5,6,-6,-3}; int[] primary = array.clone();
    sort(array); System.out.print("PRIMARY:");
    for(int i : primary){
    System.out.printf("%-5d",i);
    }
    System.out.println(); int length = process(array);
    System.out.println("Total: " + length);
    } private static void sort(int[] array){
    /*
    对数组进行取绝对值后排序
    */ if(array == null){
    throw new IllegalArgumentException("array is null.");
    } for(int i = 0 ; i < array.length ; i ++){
    array[i] = abs(array[i]);
    } Arrays.sort(array); } public static int process(int[] array){ String content = Arrays.toString(array);
    //用Array.toString(int[] array)处理后对应的String为', '形式分开
    content = content.replaceAll("(\\[|\\])","").replaceAll(" ",""); String regex = "(\\d+)(,\\1)+";
    Pattern pattern = Pattern.compile(regex);
    Matcher matcher = pattern.matcher(content);
    while(matcher.find()){
    //这里需要不断的更改content与matcher
    content = matcher.replaceFirst(matcher.group(1));
    matcher = pattern.matcher(content);
    }
    String[] strs = content.split(",");

    System.out.print("PROCESS:");
    for(String str : strs){
    System.out.printf("%-5s",str);
    }
    System.out.println(); return strs.length;

    }
    }