问题描述:给出一个整数数组,除了一个元素外,其他每个元素都出现了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. 【zzuli-1626】又是A+B吗?

    题目描述 其实这个题本来应该是那道撼烁古今的A+B签到题,但LCC小王子一看不乐意了,说:“这么经典的题怎么能让别人做,我们要留着自己做,马上把这道题给我换了.”于是把原本经典的A+B签到题改成了现在 ...

  2. C++实现设计模式之 —策略与简单工程结合

    策略模式封装算法 // cash.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include<iostream> #inc ...

  3. Draggable拖动

    Draggable(拖动)组件 学习要点: 1.加载方式 2.属性列表 3.事件列表 4.方法列表 EasyUI中Draggable(拖动)组件的使用方法,这个组件不依赖于其他组件. 1.加载方式 / ...

  4. flask中过滤器的使用

    过滤器 过滤器的本质就是函数.有时候我们不仅仅只是需要输出变量的值,我们还需要修改变量的显示,甚至格式化.运算等等,而在模板中是不能直接调用 Python 中的某些方法,那么这就用到了过滤器. 使用方 ...

  5. Linux:cd命令详解

    cd 用来变更用户所在目录的 绝对路径:路径的写法一定由根目录 "/" 写起.例如 /usr/local/mysql 这就是绝对路径.相对路径:路径的写法不是由根目录 " ...

  6. CentOS常用命令汇总

    将新创建的数据分配某个用户访问 grant all privileges on zhouzdb.* to 'zhouz'@'%' identified by '1234'; flush privile ...

  7. Bandit:一种简单而强大的在线学习算法

    假设我有5枚硬币,都是正反面不均匀的.我们玩一个游戏,每次你可以选择其中一枚硬币掷出,如果掷出正面,你将得到一百块奖励.掷硬币的次数有限(比如10000次),显然,如果要拿到最多的利益,你要做的就是尽 ...

  8. Python如何输出带颜色的文字

    print('\033[31m%s' % "这是前景色") 这是前景色 print('%s' % "这是前景色") 这是前景色 print('\033[1;31 ...

  9. ARM寄存器总结:

    ARM有16个32位的寄存器(r0到r15). r15充当程序寄存器PC,r14(link register)存储子程序的返回地址,r13存储的是堆栈地址. ARM有一个当前程序状态寄存器:CPSR. ...

  10. ASP.NET网站发布时的那些坑

    开发工具:VS2010,MVC4.0,SQLSERVER2008 服务器:Windows server 2012,IIS8,SQLSERVER2012 一.发布后,每个页面第一次打开都很卡,50秒或更 ...