JAVA算法:查找给定的数组中只出现了一次的数组元素

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


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值