//计算数组中,求绝对值后,不重复的数字个数
/* 例如:
数组: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,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));
}
}
可以改进的一点是:不必把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();
}
万一数组中有10,0000这样的元素,岂不是要新建一个int[100000]……
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());
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;
}
}可以用正则,但这个的速度可能也不是最快的!
/* 例如:
数组: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;
}
}