一、问题描述
功能描述:找出一个int[]中满足 2^n的数字,然后组成的新的数组 输入:{4,3,8} 输出:{4,8}
二、算法描述
/**
* Finds the number matches condition' 2^n' from input data array.
* @param data
* @return the resultArray including number which matches requirement
*/
public int[] nextString(int[] data) {
Vector<Integer> v = new Vector<Integer>();
for (int i = 0; i < data.length; i++) {
if(isSpecialNumber(data[i])) {
v.add(data[i]);
}
}
int[] result = new int[v.size()];
for (int i = 0; i < result.length; i++) {
result[i] = v.get(i);
}
Arrays.sort(result);
v = null;
return result;
}
/**
* Judges whether the input num matches condition ' 2^n'.
* @param num
* @return
*/
public boolean isSpecialNumber(int num) {
boolean flag = false;
while (num >= 2) {
if (num % 2 != 0) {
flag = false;
break;
}
if (num / 2 == 1) {
flag = true;
break;
} else {
num = num / 2;
}
}
return flag;
}
算法二、以下来自网友算法。
/**
* Comes from the online-friends
* @param data
* @return
*/
public int[] nextString1(int[] data)
{
List<Integer> li = new ArrayList<Integer>();
for(int i=0;i<data.length;i++){
if(check(data[i]))
li.add(data[i]);
}
int[] arr = new int[li.size()];
for(int i=0;i<arr.length;i++){
arr[i] = li.get(i);
}
return arr;
}
/**
* Comes from the online-friends
* @param n
* @return
*/
public boolean check(int n) {
if (n == 1)
return true;
else if (n % 2 == 1)
return false;
else
return check(n / 2);
}
三、测试结果
public static void main(String[] args) {
Main15 m = new Main15();
//int[] data = {4,3,8,6,9,0,16,2,32,78,64};
int[] data = {4,3,8,6,9,2,32,78,64};
data = m.nextString1(data);
System.out.println("--------wangyou---------");
for (int i = 0; i < data.length; i++) {
System.out.print(data[i]+",");
}
System.out.println();
System.out.println("-------personal---------");
data = m.nextString(data);
for (int i = 0; i < data.length; i++) {
System.out.print(data[i]+",");
}
}
结果
--------wangyou---------
4,8,2,32,64,
-------personal---------
2,4,8,32,64,