import java.util.Arrays;
/*
* 一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。
* 暴力搜索:O(n^2)
*/
public class FindNumsAppearOnce {
//num1,num2分别为长度为1的数组。传出参数
//将num1[0],num2[0]设置为返回结果
public void findNumsAppearOnce(int [] array, int num1[], int num2[]) {
if(array == null || array.length == 1) return;
int number = 1; //记录只出现一次的数字的个数
for(int i = 0;i < array.length;i ++) {
int count = 0; //计每个数字出现的次数
for(int j = 0;j < array.length;j ++) {
if(array[j] == array[i]) count ++;
}
//只出现一次的数字第一次出现
if(count == 1 && number == 1) {
num1[0] = array[i];
count = 0;
number ++;
}
//只出现一次的数字第二次出现
if(count == 1 && number == 2) {
num2[0] = array[i];
break;
}
}
//System.out.println(num1[0] + " " + num2[0]);
}
//先排序,算法复杂度是O(nlogn),如果某个元素左右两边的元素和它均不同(不包括开头和结尾,开头和结尾单独考虑),则这个数字只出现一次
public void findNumsAppearOnce2(int [] array, int num1[], int num2[]) {
if(array == null || array.length == 1) return;
Arrays.sort(array);
int number = 0; //记录只出现一次的数字的个数
for(int i = 0;i < array.length;i ++) {
//考虑在开头:开头只可能是第一次出现的数字
if(i == 0 && array[i] != array[i + 1]) {
number ++;
num1[0] = array[i];
continue;
}
//考虑在结尾:结尾只可能是最后一次出现的数字
if(i == array.length -1 && array[i] != array[i - 1]) {
num2[0] = array[i];
break;
}
if(i != 0 && i != array.length -1 && number == 0
&& array[i] != array[i - 1] && array[i] != array[i + 1]) {
number ++;
num1[0] = array[i];
continue;
}
if(i != 0 && i != array.length -1 && number == 1
&& array[i] != array[i - 1] && array[i] != array[i + 1]) {
num2[0] = array[i];
break;
}
}
System.out.println(num1[0] + " " + num2[0]);
}
public static void main(String[] args) {
int [] array = {6,2,3,3,2,4};
int num1[] = new int[1];
int num2[] = new int[1];
new FindNumsAppearOnce().findNumsAppearOnce(array, num1, num2);
}
}
《剑指offer》-寻找整形数组中两个只出现一次的数字
最新推荐文章于 2021-08-25 16:14:29 发布