• leetcode|Single Number III


    Given an array of numbers nums, in which exactly two elements appear only once and all the other elements appear exactly twice. Find the two elements that appear only once.

    For example:

    Given nums = [1, 2, 1, 3, 2, 5], return [3, 5].

    题目:给一个数组,数组里面有相同的元素,有不同的元素,每组相同的元素刚好有两个,不同的元素也是刚好两个

    思路:1,之前没认真看题目的条件,导致写了一套通用的,不管相同元素有多少个,代码优化之如下:

    public int[] singleNumber(int[] nums) {

      int len = nums.length;
      Map<Integer,Integer> countMap = new HashMap<Integer,Integer>();
      for(int i = 0;i<len;i++){
        Integer count = countMap.get(nums[i]);
        if(count==null){
          countMap.put(nums[i],1);
        }else{
          countMap.put(nums[i],count+1);
        }
      }

      int[] res = new int[2];
      int i = 0;
      for(Entry e :countMap.entrySet()){
        if((Integer)e.getValue()==1){
          res[i++] = (Integer)e.getKey();
        }
    }
    return res;

    }

    更符合题意的思路2:

    思路2主要是根据逻辑位运算的特点:因为题意是每一组相同元素的个数只有两个,那么我们只要把它们异或XOR运算一下,就为0了,将数组所有的数逐一进行异或运算,最后得到的就是两个不同的元素的异或的结果,可以根据这个结果取其二进制形式中的某一位1,为什么去1呢,因为异或运算就是相同为0,不同为1,这个可以区分的是两个不同数,区分出来了,over。。。

    public int[] singleNumber(int[] nums) {

      int distinct = 0,len = nums.length;

      for(int i = 0;i <len;i++){

        distinct ^= nums[i];

      }

      distinct &=-distinct;

      int res [] = new int[2];

      for(int i = 0;i<len;i++){

        if((res&nums[i])==0){

          res[0] ^=nums[i];

        }else{

          res[1]^=nums[i];

        }

      }

      return res;

    }

    runtime居然2ms,比我之前那个是快多了,说实话,这个道题让我感觉到了编程的快乐

  • 相关阅读:
    ASP.NET常见安全缺陷集锦[转]
    林黛玉出家:给予中国给予我们的警示![摘]
    关于管理 关于经营 还有很多东西都无从做好
    ASP.NET 2.0的新增服务、控件与功能
    将可视的DataGrid、DataList等的规范表数据导出并写入xls或doc格式保存
    2006全球最具影响力品牌
    .NET环境下水晶报表使用总结[转]
    Asp.net(C#)分层——基础类
    Asp.Net传参方式小结
    MSN签名都成了广告位
  • 原文地址:https://www.cnblogs.com/wujunjie/p/5674210.html
Copyright © 2020-2023  润新知