找出数组中只出现一次的数字,其它数字都出现了两次(java)

题目描述:通过键盘录入数组,一个整型数组里除了一个数字外,其他的数字都出现两次,找出这个数字。

                  键盘录入:[1,3,4,4,3,1,5]

                  键盘输出:5

详细代码:

public class shuzu {
    public static void main(String[] args) {
    	//fun2();
    	fun1();
    
    }
    
    //方法二:通过TreeMap集合方法求出
    public static void fun2(){
    	  int[] a = tool();
    	
    	  TreeMap<Integer, Integer> hm = new TreeMap<Integer, Integer>();
    	 
  
    	  for(Integer i : a){
    		  if(hm.containsKey(i))
    			   hm.put(i, hm.get(i)+1);
    		  else
    			  hm.put(i, 1);
    	  }
    	
    	  for(Map.Entry<Integer, Integer> ar : hm.entrySet()){
    		  if(ar.getValue()==1)
    			  System.out.println(ar.getKey());
    	  } 	  
    }
    
    //方法一:通过异或的运算,找出一个数字
    public static void fun1(){
    	
  	  int[] a = tool();
  	  int result = a[0];
  	  for(int j=1;j<a.length;j++){
  		  result = a[j]^result;
  	  }
  	  System.out.println(result);
  	  
    }
    
    //把输入的数据存入到数组中
    public static int[] tool() {
    	
          Scanner sc = new Scanner(System.in);
    	  String str = sc.nextLine();
    	  String line = str.substring(1, str.length()-1);
    	  String[] buf = line.split(",");	   
    	
    	  int[] a = new int[buf.length];
    	  for(int i=0;i<a.length;i++) {
    		  
    		  a[i]=Integer.valueOf(buf[i]);
    	  }
    	  
    	  return a;
     }
}

一. 通过键盘输入字符串([1,3,4,4,3,1,5]),首先要对输入的数据格式做处理,需用到String类的substring()方法,把输入的"[ ]"

去除,该方法参数为截取部分字符串,中有两个参数start和end,截取后包含头,不包含尾,所以start=1,end=str.length-1,

然后字符串变为"1,3,4,4,3,1,5", 再通过String类的split()方法, 按照","分割存到字符串数组中。再通过Integer类中的valueof()

方法即可将String类型数组转换为int类型数组。

 

二. 方法一:

    通过位运算异或(^):

    异或运算中,任何一个数字和自己本身异或都是0,任何一个数字和0异或都是本身。

    通过该方法即可运用到该题中 ( 除了有两个数字只出现了一次,其他数字都出现了两次);所以从头到尾异或数组中

    的每一 个数字,那些出现了两次的数字全部在异或中被抵消掉。

    示例:(1,3,4,4,3,1,5)

    1^3=2  2^4=6  6^4=2  2^3=1  1^1=0  0^5=5

    异或的本质是通过位运算来计算 ,就是先把十进制的数先换为二进制,然后通过异或规则即可得到出现一次的数字。

 

三. 方法二:

     利用集合Map

     详细过程:通过遍历数组存到Map集合中在存入时进行判断,把数组中的元素存到Map集合中键里,依次判断存进的数

     若集合中不存在,即存入,把值赋为一;若集合中存在,即把值加一,依次遍历完,当值为一的那个元素,即是数组中

     只出现一次的数。

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值