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

作者: yzawyx0220 | 来源:发表于2017-01-16 16:33 被阅读138次

    (|)
    给出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;
        }
    };
    

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

    相关文章

      网友评论

        本文标题:lintcode 落单的数(|,||,|||)

        本文链接:https://www.haomeiwen.com/subject/vkdpbttx.html