137. Single Number II

寻找唯一一次出现的整数
本文介绍了一种算法挑战:在一个除一个元素外所有元素都出现三次的整数数组中找到那个仅出现一次的元素。提出了三种解决方案:通过排序与遍历、使用映射表(map)以及位运算的方法来解决此问题,并对比了它们的时间效率。

Title

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?

Solution

排序 & 遍历

class Solution {
public:
    int singleNumber(vector<int>& nums) {
        if (nums.size() == 1) {
            return nums[0];
        }

        if (nums.size() == 2 || nums.size() == 3) {
            return -1;
        }

        sort(nums.begin(), nums.end());

        decltype(nums.size()) i=2;

        while (i!=nums.size()) {
            if (nums[i-2] == nums[i] && nums[i] == nums[i-1]) {
                i += 3;
            }
            else {
                return nums[i-2];
            }
        }

        return nums[i-2];
    }
};

runtime: 19ms

map

class Solution {
public:
    int singleNumber(vector<int>& nums) {
        if (nums.size() == 1) {
            return nums[0];
        }

        map<int, int> mNum;

        for (const auto &key : nums) {
            ++mNum[key];
        }

        for (auto i = mNum.begin(); i != mNum.end(); ++i) {
            if (i->second == 1) {
                return i->first;
            }
        }

        return -1;
    }
};

runtime: 28ms

位运算

以后再说。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值