JAVA代码—算法基础:找出整形数组中只出现过1次的两个元素

找出整形数组中只出现过1次的两个元素

一个整形数组中,除了两个数字之外,其它数字都出现了两次。
写一个程序,求出只出现了一次的数字。

例如:数组元素为 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]);

        }

    }

}

(完)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值