[LeetCode 137] Single Number II(位运算的巧妙运用初级篇)

来源:互联网 发布:交通组织优化定义 编辑:程序博客网 时间:2024/05/16 12:18

题目内容

137 Single Number II
Given an array of integers, every element appears three times except for one. Find that single one.

Note:
Your algorithm should have a linear runtime complexity. Could you implement it without using extra memory?
题目来源

题目简述

找出数组中单独的一个元素,其余元素均出现三次。

题目分析

Single Number I 一题中 其余元素出现两次,同样要求找出数组中单独的元素。该题可巧妙利用位异或运算的特殊性:即相同元素为异或运算结果为零,遍历数组并累计每个元素异或运算的结果即得到单独元素。
本题中其余元素出现三次,无法像上题中用某种单独的运算直接得到结果。所以,可以用位统计的方法。数据类型INT为32位,用包含32个元素的统计数组,统计中数组中每个数二进制化后每个位出现的次数。统计数组中每个数对3求模(结果只能为0或1)后可得到单独元素二进制数的各位情况。化为十进制后即得到结果。
该解法对于类似问题通用且有一定启发作用,较为推荐。

代码示例

class Solution {public:    int singleNumber(vector<int>& nums) {        int memo[32]={0};        int res=0;        for(int i=0;i!=32;i++)        {            for(int j=0;j!=nums.size();j++)            {                memo[i]+=(nums[j]>>i)&1;            }            res+=(memo[i]%3)<<i;        }        return res;    }};
0 0