问题描述:给出一个整数数组,除了一个元素外,其他每个元素都出现了2次,找出只出现1次的元素。

int singleNumber(vector<int>& nums);

分析:比较自然的想法是用一个容器来进行插入、查找、删除操作。遍历nums,先查找容器中是否包含该元素,是则插入,否则删除。最后容器中只剩下只出现1次的元素。

解法:

    int singleNumber(vector<int>& nums) {
int i = 0;
unordered_set<int> temp;
for (auto i : nums)
{
if (temp.count(i))
temp.erase(i);
else
temp.insert(i);
}
return *(temp.begin());
} // 15/15 44ms 8.57%

因此只需要选择适当的容器,set显然适合执行这个任务,但是其实unordered_set(无序集)效率更佳,使用哈希表比维护一颗二叉平衡树(STL是红黑树)要省时,对比时间:无序集是20ms,有序集是44ms。

会占用不确定的额外空间,最好是1,最坏是n / 2。

更合适且高效的做法:

当然是位运算了……(发现通过率最高的几个都是用到位运算的小花招)

利用XOR运算进行2次会还原的性质,即a ^ b ^ b = a,对整个序列依次XOR运算完毕后得到的就是a0 ^ ret,a0为初始值,ret为返回值,设a0为0即可。

利用lambda表达式可以一行完成。

    int singleNumber(vector<int>& nums) {
return accumulate(nums.begin(), nums.end(), 0,
[](int a, int b) { return a ^ b; });
} // 15/15 20ms 26.77%

上述方法需要1个额外空间,其实实际应用来说基本相当于没有。但是其实也可以不用额外空间,也就是从nums第一个元素开始累积,这就需要考虑特殊情况,nums只有1个元素。

    int singleNumber(vector<int>& nums) {
int len = nums.size();
if (len == 1)
return nums[0];
auto& ret = nums[0];
for (int i = 1; i < len; ++i)
ret ^= nums[i];
return ret;
} // 15/15 20ms 26.77%

【Leetcode 136】Single Number的更多相关文章

  1. 【LEETCODE OJ】Single Number II

    Problem link: http://oj.leetcode.com/problems/single-number-ii/ The problem seems like the Single Nu ...

  2. 【LEETCODE OJ】Single Number

    Prolbem link: http://oj.leetcode.com/problems/single-number/ This prolbem can be solved by using XOR ...

  3. [LeetCode#136, 137]Single Number, Single Number 2

    The question: Single Number Given an array of integers, every element appears twice except for one. ...

  4. 【LeetCode OJ 136】Single Number

    题目链接:https://leetcode.com/problems/single-number/ 题目:Given an array of integers, every element appea ...

  5. 【leetcode 136】136. Single Number

    要求:给定一个整数数组,除了其中1个元素之外,其他元素都会出现两次.找出这个只出现1次的元素. 例: array =[3,3,2,2,1]    找出元素1. 思路:最开始的想法是用两次for循环,拿 ...

  6. 【LeetCode】【Python题解】Single Number &amp; Maximum Depth of Binary Tree

    今天做了三道LeetCode上的简单题目,每道题都是用c++和Python两种语言写的.由于c++版的代码网上比較多.所以就仅仅分享一下Python的代码吧,刚学完Python的基本的语法,做做Lee ...

  7. leetcode@ [136/137] Single Number & Single Number II

    https://leetcode.com/problems/single-number/ Given an array of integers, every element appears twice ...

  8. leetcode 136、Single Number

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

  9. 【LeetCode #179】Largest Number 解题报告

    原题链接:Largest Number 题目描述: Given a list of non negative integers, arrange them such that they form th ...

随机推荐

  1. Java复习8.多线程

    Java复习8 多线程知识 20131007 前言: 在Java中本身就是支持多线程程序的,而不是像C++那样,对于多线程的程序,需要调用操作系统的API 接口去实现多线程的程序,而Java是支持多线 ...

  2. Loadrunner 11检查点使用方法总结

    在使用Loadrunner 11进行性能测试中,有时需要对性能测试中的功能是否全部正确进行判断.这里就需要用到“检查点”,本文总结了常用三种协议下检查点的使用方法,希望阅读本文后的小伙伴们能够掌握其使 ...

  3. 《APUE》第7章 进程环境-读书笔记

    一.main函数. main函数的原型如下.argc是命令行参数的数目,argv是指向参数的各个指针所构成的数组. int main(int argc, char *argv[]) 当内核执行C程序时 ...

  4. LeetCode之Longest Substring Without Repeating Characters

    [题目描述] Given a string, find the length of the longest substring without repeating characters. Exampl ...

  5. Linux:paste命令详解

    paste 直接将两行贴在一起,且中间以[TAB]键隔开 语法 paste(选项)(file1 file2) 选项 -d<间隔字符>或--delimiters=<间隔字符>:用 ...

  6. Kotlin Reference (七) Returns and Jumps

    most from reference kotlin有三个结构跳跃表达式 return 默认情况下,从最近的封闭函数或匿名函数返回. break 跳出整个循环 continue 跳出本次循环,进行下一 ...

  7. keras系列︱利用fit_generator最小化显存占用比率/数据Batch化

    本文主要参考两篇文献: 1.<深度学习theano/tensorflow多显卡多人使用问题集> 2.基于双向LSTM和迁移学习的seq2seq核心实体识别 运行机器学习算法时,很多人一开始 ...

  8. 单机ZooKeeper配置

    1.创建zoo.cfg copy D:\zookeeper3.4.6\conf\zoo_sample.cfg zoo.cfg 修改追加如下内容 dataDir=D:/zookeeper3.4.6/da ...

  9. Makefile中怎么使用Shell if判断

    /********************************************************************* * Makefile中怎么使用Shell if判断 * 说 ...

  10. I.MX6 linux eGalaxTouch 自动获取设备节点

    I.MX6 linux eGalaxTouch 自动获取设备节点 \\\\\\\\\\\\\\-*- 目录 -*-///////////// | 一. 需求: | 二. /proc/bus/input ...