Single Number

来源:互联网 发布:越狱铃声软件 编辑:程序博客网 时间:2024/06/06 18:15

https://leetcode.com/problems/single-number/

这是来自于leetcode上的一道题目。这里主要强调的是解决题目时候必须数学先行。题目虽然很简单,不假思考就可以给出几个很直观的答案,但是由于时间复杂度是O(nlogn)空间复杂度是O(n)

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());        for(int i=0;i<nums.size();i++)        {            if(i+1<nums.size())              if(nums[i]==nums[i+1])                 i++;              else                 return nums[i];                 if(i+1==nums.size())                 return nums[i];        }    }};

第二种方法是采用unordered_map的方式进行存储

class Solution {public:    int singleNumber(vector<int>& nums) {       unordered_map<int ,int>umap;       for(int i=0;i<nums.size();i++)         umap[nums[i]]++;        for(auto it:umap)          if(it.second==1)            return it.first;    }};

第三种方法是由于因为只有一个数不重复,其他每个数都出现两次。那么进行异或操作之后就为0;

class Solution {public:    int singleNumber(vector<int>& nums) {     int res=0;     for(int i=0;i<nums.size();i++)        res^=nums[i];        return res;    }};

所以做题目时候,可以先把问题当成数学问题会怎么算,就是忽略了数据结构

如果能直接给出

result=f(已知条件)

这样的函数,那么问题就会简单很多!

1 0
原创粉丝点击