JAVA算法:查找给定的数组中只出现了一次的数组元素
一个整形数组中,除了两个数字之外,其它数字都出现了两次。
写一个程序,求出只出现了一次的数字。
例如:数组元素为 4,2,8,3,4,5,8,7,7,2
上述数组中元素3和元素5只出现了一次。
算法设计
package com.bean.algorithmexec;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
import java.util.Set;
public class FindOnlyOneElementDemo {
/*
* 一个整形数组中,除了两个数字之外,其它数字都出现了两次。
* 写一个程序,求出只出现了一次的数字。
*
* 例如:数组元素为 4,2,8,3,4,5,8,7,7,2
* 上述数组中元素3和元素5只出现了一次。
* */
static int T=0;
/*
* 方法名称:findNumsAppearOnce
* num1,num2分别为长度为1的数组。传出参数
* 将num1[0],num2[0]设置为返回结果
*
* */
public static void findNumsAppearOnce(int [] array,int num1[] , int num2[]) {
//如果array数组长度为0或者数组为空,则直接返回
if(array == null || array.length == 0)
return;
/*
* 用一个map来装没有出现过的数,如果map中已经有这个数了,就说明这个数是第2次出现了,
* 所以把这个数从map中remove掉,这样遍历一遍后map中就只会剩下只出现一次的那两个值。
* */
Map<Integer,Integer> map = new HashMap<Integer,Integer>();
int len = array.length;
for(int i = 0; i < len; i++){
if(map.containsKey(array[i])){
map.remove(array[i]);
}else{
map.put(array[i],1);
}
}
Set<Integer> keys = map.keySet();
int index = 0;
for(Integer key :keys){
if(index == 0){
num1[0] = key;
index++;
}else{
num2[0] = key;
}
}
}
public static void main(String[] args) throws FileNotFoundException {
// TODO Auto-generated method stub
System.setIn(new FileInputStream("G:\\findonlyoneelement.txt"));
Scanner sc = new Scanner(System.in);
int Answer=0;
//读取测试用例组数
T=sc.nextInt();
for(int i=0;i<T;i++) {
//读取数组元素个数
int length=sc.nextInt();
//声明数组
int[] numbers=new int[length];
for(int m=0;m<length;m++) {
//读取整形数组元素
numbers[m]=sc.nextInt();
//System.out.print(numbers[m]+"\t");
}
//System.out.println();
int[] num1=new int[1];
int[] num2=new int[1];
findNumsAppearOnce(numbers,num1,num2);
System.out.println("1st: "+num1[0]+"\t2nd: "+num2[0]);
}
}
}
程序运行结果:
1st: 3 2nd: 5
1st: 1 2nd: 2
附上:文件内容
2
10
4 2 8 3 4 5 8 7 7 2
6
3 3 2 1 4 4