zoukankan      html  css  js  c++  java
  • 136. Single Number

    Given an 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?

    class Solution {
    public:
        int singleNumber(vector<int>& nums) {
            sort(nums.begin(), nums.end());
            vector<int>::size_type i;
            for(i = 0; i < nums.size() - 2; i += 2)
            {
                if(nums[i] != nums[i + 1])
                {
                    break;
                }
            }
            return nums[i];
        }
    };
    排序可以过,但是不满足时间复杂度O(n)的条件
    讨论区一个很巧妙的算法,利用亦或

    https://discuss.leetcode.com/topic/1916/my-o-n-solution-using-xor

    ^ 按位异或 若参加运算的两个二进制位值相同则为0,否则为1

    对于如下:

    int x = 5;

    int y = 0;

    cout << (x ^ y);//5

    y = 5;

    cout << (x ^ y);//0

    题外话:利用亦或,不用第三个变量交换两个数。

    int main()
    {
    	int x = 10;
        int y = 100;
        cout << "x = " << x << ";y = " << y << endl;
    
        x = x ^ y;
        y = x ^ y;
        x = x ^ y;
    
        cout << "x = " << x << ";y = " << y << endl;
    	return 0;
    }
    即:

    x = x ^ y;

    y = x ^ y = x ^ y ^ y = x;

    x = x ^ y = x ^ y ^ x = y;

    #include <iostream>
    #include <vector>
    #include <set>
    #include <algorithm>
    using namespace std;
    
    class Solution {
    public:
        int singleNumber(vector<int>& nums) {
        	int result = 0;
        	for (auto iter = nums.begin(); iter != nums.end(); iter++)
        	{
        		result ^= *iter;
        	}
        	return result;
        }
    };
    
    int main()
    {
    	Solution s;
    	vector<int>vec{1,2,3,3,5,2,1,4,4};
    	cout << s.singleNumber(vec);
    	return 0;
    }


    相同的题:

    389. Find the Difference

    Given two strings s and t which consist of only lowercase letters.

    String t is generated by random shuffling string s and then add one more letter at a random position.

    Find the letter that was added in t.

    Example:

    Input:
    s = "abcd"
    t = "abcde"
    
    Output:
    e
    
    Explanation:
    'e' is the letter that was added.
    class Solution {
    public:
        char findTheDifference(string s, string t) {
        	char ch = 0;
            for (string::size_type i = 0; i < s.size(); ++i)
            {
            	ch ^= s[i];
            }
            for (string::size_type i = 0; i < t.size(); ++i)
            {
            	ch ^= t[i];
            }
            return ch;
        }
    };




    Keep it simple!
    作者:N3verL4nd
    知识共享,欢迎转载。
  • 相关阅读:
    Ubuntu 或 UbuntuKyLin14.04 Unity桌面側边栏和顶层菜单条显示异常解决方法
    关于程序猿的几个阶段!
    独立开发人员低成本推广APP的18条技巧
    Effective C++ 条款27
    OpensStack instance debug
    OpenStackCLI调试及术语识记
    OpenStack术语名词及问题调试
    apacheOfbiz
    obiz
    How to run OFBiz as a Service on linux
  • 原文地址:https://www.cnblogs.com/lgh1992314/p/6616331.html
Copyright © 2011-2022 走看看