leetcode_137 Single Number II

来源:互联网 发布:买烟用什么软件 编辑:程序博客网 时间:2024/06/05 03:00
  • 题目分析:

    给定一个数组,里面只有一个数只出现一次,其他的数均出现三次,请找出这个只出现一次的数。

  • 解题思路:

    • 方法1 利用map实现

      1)遍历整个数组,统计数组中每个数出现的次数,并将其保存在map种

      2)遍历数组中元素,查看map中对应元素出现的次数,如果出现只出现一次,则返回次元素,并结束程序即可。

    • 方法2 统计数组数的各个位之和

      1)int类型是32位数,对数组中所有数(32位int类)的各个位进行求和

      2)将就和的结果进行模3操作,放在结果的对应位置上即可。

    • 方法3 统计出现1次,2次,3次的数

      整体思想:利用3个变量分别保存各个二进制位上1出现一次、两次、三次的分布情况,最后只需要返回变量1就可以了。

      1)每次循环先计算twos,即出现两次的1的分布;

      2)然后计算出现一次的1的分布;

      3)接着二者进行与操作,得到三次出现1的分布;

      4)然后多three取反,在与ones、twos进行与操作,目的是将出现三次的位置清零。

  • 实现程序

    • C++版本

      // 方法1实现int singleNumber(vector<int> nums){    map<int, int> mp;    for (int i = 0; i < nums.size(); i++)    {        mp[nums[i]]++;    }    for (int i = 0; i < nums.size(); i++)    {        if (mp[nums[i]] == 1)            return nums[i];    }     return 0;}//方法2实现 int singleNumber1(vector<int> &nums){    int bitnum[32] = {0};    int result = 0;    for (int i = 0; i < 32; i++)    {        // 统计所有数对应第i位数的所有和         for (int j = 0; j < nums.size(); j++)        {            bitnum[i] += (nums[j] >> i) & 1;        }        // 获取最后结果中第i位数对应的值         result |= (bitnum[i] % 3) << i;    }    return result;}//方法3实现int singleNumber1(vector<int> nums){    int one = 0;    int two = 0;    int three = 0;    for (int i = 0; i < nums.size(); i++)    {        two |= one & nums[i];        one ^= nums[i];        three = one & two;        one &= ~three;        two &= ~three;    }    return one;}
    • Java版本

      // 方法1实现public int singleNumber1(int[] nums){    Map<Integer, Integer> mp = new HashMap<Integer, Integer>();    // 统计每个数出现的次数    for (int i = 0; i < nums.length; i++){        if (mp.containsKey(nums[i])){            int count = mp.get(nums[i]);            mp.put(nums[i], count + 1);        }        else        {            mp.put(nums[i], 1);        }    }    // 遍历map,取出只出现1次的数    Set<Integer> keys = mp.keySet();    for (int key : keys){        if (mp.get(key) == 1)            return key;    }    return 0;}// 方法2实现public int singleNumber2(int[] nums){    int[] bitnum = new int[32];    for (int i = 0; i < bitnum.length; i++){        bitnum[i] = 0;    }    int result = 0;    for (int i = 0; i < 32; i++){        for (int j = 0; j < nums.length; j++){            bitnum[i] += (nums[j] >> i) & 1;        }        result |= (bitnum[i] % 3) << i;    }    return result;}// 方法3实现public int singleNumber(int[] nums){    int one = 0;    int two = 0;    int three = 0;    for (int i = 0; i < nums.length; i++){        two |= one & nums[i];        one ^= nums[i];        three = one & two;        one &= ~three;        two &= ~three;    }    return one;}
0 0
原创粉丝点击