136. Single Number(easy)

 

Easy

221183FavoriteShare

Given a non-empty array of integers, every element appears twice except for one. Find that single one.

Note:

Your algorithm should have a linear runtime complexity. Could you implement it without using extra memory?

Example 1:

Input: [2,2,1]
Output: 1

Example 2:

Input: [4,1,2,1,2]
Output: 4

Java:

哈希表法:


/*
 * @Author: SourDumplings
 * @Link: https://github.com/SourDumplings/
 * @Email: changzheng300@foxmail.com
 * @Description: https://leetcode.com/problems/single-number/
 * @Date: 2019-03-31 19:18:33
 */

import java.util.Hashtable;

class Solution
{
    public int singleNumber(int[] nums)
    {
        Hashtable<Integer, Integer> h = new Hashtable<Integer, Integer>();
        for (int i : nums)
        {
            if (h.containsKey(i))
                h.put(i, h.get(i) + 1);
            else
                h.put(i, 1);
        }
        int ret = 0;
        for (int i : nums)
        {
            if (h.get(i) == 1)
            {
                ret = i;
                break;
            }
        }
        return ret;
    }
}

C++:

哈希表法:

/*
 * @Author: SourDumplings
 * @Link: https://github.com/SourDumplings/
 * @Email: changzheng300@foxmail.com
 * @Description: https://leetcode.com/problems/single-number/
 * @Date: 2019-03-31 19:11:50
 */

class Solution
{
  public:
    int singleNumber(vector<int> &nums)
    {
        unordered_map<int, int> map;
        int ret;
        for (auto &i : nums)
        {
            ++map[i];
        }
        for (auto &i : nums)
        {
            if (map[i] == 1)
            {
                ret = i;
                break;
            }
        }
        return ret;
    }
};

算术法:

/*
 * @Author: SourDumplings
 * @Link: https://github.com/SourDumplings/
 * @Email: changzheng300@foxmail.com
 * @Description: https://leetcode.com/problems/single-number/
 * @Date: 2019-03-31 19:11:50
 * 
 * 将所有的数放在集合里,求和再2倍,再减去原序列和即可
 */

class Solution
{
  public:
    int singleNumber(vector<int> &nums)
    {
        set<int> s;
        for (auto &i : nums)
        {
            s.insert(i);
        }
        int temp = accumulate(s.begin(), s.end(), 0) * 2;
        return temp - accumulate(nums.begin(), nums.end(), 0);
    }
};

 位运算法:

/*
 * @Author: SourDumplings
 * @Link: https://github.com/SourDumplings/
 * @Email: changzheng300@foxmail.com
 * @Description: https://leetcode.com/problems/single-number/
 * @Date: 2019-03-31 19:11:50
 * 
 * a ^ a = 0, a ^ 0 = a, (a ^ a) ^ b = b
 * 故我们将所有的数异或起来即可
 */

class Solution
{
  public:
    int singleNumber(vector<int> &nums)
    {
        int ret = 0;
        for (auto &i : nums)
        {
            ret ^= i;
        }

        return ret;
    }
};

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值