lintcode 落单的数(|,||,|||)

(|)
给出2*n + 1 个的数字,除其中一个数字之外其他每个数字均出现两次,找到这个数字。
样例
给出 [1,2,2,1,3,4,3],返回 4
题目链接:http://www.lintcode.com/zh-cn/problem/single-number/

将数组的数全部做异或,最后得到的数就是要找的数,因为和一个数做两次异或不会改变。

class Solution {
public:
    /**
     * @param A: Array of integers.
     * return: The single number.
     */
    int singleNumber(vector<int> &A) {
        // write your code here
        int res;
        for (int i = 0;i < A.size();i++) {
            res ^= A[i];
        }
        return res;
    }
};

(||)
给出3*n + 1 个的数字,除其中一个数字之外其他每个数字均出现三次,找到这个数字。
样例
给出 [1,1,2,3,3,3,2,2,4,1] ,返回 4
题目链接:http://www.lintcode.com/zh-cn/problem/single-number-ii/#

先将数组排序,依次遍历寻找

class Solution {
public:
    /**
     * @param A : An integer array
     * @return : An integer 
     */
    int singleNumberII(vector<int> &A) {
        // write your code here
        if (A.empty()) return 0;
        sort(A.begin(),A.end());
        int i = 0;
        while (i < A.size()) {
            if (A[i] == A[i + 1] && A[i] == A[i + 2]) i += 3;
            else break;
        }
        return i > A.size() ? A[A.size() - 1] : A[i];
    }
};

(|||)
给出2*n + 2个的数字,除其中两个数字之外其他每个数字均出现两次,找到这两个数字。
样例
给出 [1,2,2,3,4,4,5,3],返回 1和5
题目链接:http://www.lintcode.com/zh-cn/problem/single-number-iii/
思路同第二题:

class Solution {
public:
    /**
     * @param A : An integer array
     * @return : Two integers
     */
    vector<int> singleNumberIII(vector<int> &A) {
        // write your code here
        vector<int> res;
        sort(A.begin(), A.end());
        int i = 0;
        while (i < A.size()) {
            if (A[i] == A[i + 1]) i += 2;
            else {
                res.push_back(A[i]);
                i++;
            }
            if (res.size() == 2) break;
        }
        return res;
    }
};

关于第二题和第三题还有一种解法,就是将数组中的数字转换为二进制,网上有较多这种方法,就不赘述了。

    原文作者:yzawyx0220
    原文地址: https://www.jianshu.com/p/4ac26fdfd1c5
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞