问题描述:给出一个整数数组,除了一个元素外,其他每个元素都出现了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);elsetemp.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%

转载于:https://www.cnblogs.com/Harley-Quinn/p/5805202.html

【Leetcode 136】Single Number相关推荐

  1. 【LeetCode OJ 136】Single Number

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

  2. 【LeetCode 871】 Minimum Number of Refueling Stops

    题目描述 A car travels from a starting position to a destination which is target miles east of the start ...

  3. python找出只出现一次的数字_【LeetCode 136】只出现一次的数字(Python)

    题目:给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次.找出那个只出现了一次的元素. 说明:你的算法应该具有线性时间复杂度. 你可以不使用额外空间来实现吗? 一.思路 通过遍历 ...

  4. 重复次数最多的 子串_每日算法系列【LeetCode 424】替换后的最长重复字符

    题目描述 给你一个仅由大写英文字母组成的字符串,你可以将任意位置上的字符替换成另外的字符,总共可最多替换 k 次.在执行上述操作后,找到包含重复字母的最长子串的长度. 示例1 输入: s = &quo ...

  5. 【LeetCode - 32】最长有效括号

    给你一个只包含 '(' 和 ')' 的字符串,找出最长有效(格式正确且连续)括号子串的长度. 示例 1: 输入:s = "(()" 输出:2 解释:最长有效括号子串是 " ...

  6. 【LeetCode题解】二叉树的遍历

    我准备开始一个新系列[LeetCode题解],用来记录刷题,顺便复习一下数据结构与算法. 1. 二叉树 二叉树(binary tree)是一种极为普遍的数据结构,树的每一个节点最多只有两个节点--左孩 ...

  7. 如何给柱状图柱子添加阴影_【LeetCode日记】84. 柱状图中最大的矩形

    题目描述 ` 给定 n 个非负整数,用来表示柱状图中各个柱子的高度.每个柱子彼此相邻,且宽度为 1 . 求在该柱状图中,能够勾勒出来的矩形的最大面积. 以上是柱状图的示例,其中每个柱子的宽度为 1,给 ...

  8. 【LeetCode笔记】253. 会议室 II(Java、偏数学)

    文章目录 题目描述 思路 && 代码 计划里 hot 100 + 剑指Offer 的题目中唯一一道会员题,同时也是最后一道没写的题,刚好今天 leetcode 发了一天会员可以写上-简 ...

  9. 【LeetCode笔记】301. 删除无效的括号(Java、DFS、字符串)

    文章目录 题目描述 思路 && 代码 二刷 题目描述 [所有可能结果]-> [暴力DFS] 思路 && 代码 代码比较长,但是总体思路很清晰. 剪枝:舍弃左括号. ...

  10. 【LeetCode笔记】剑指 Offer 56 . 数组中数字出现的次数(Java、位运算)

    文章目录 题目描述 思路 & 代码 题目描述 比 leetcode 136要难点 注意:空间复杂度要求O(1),否则用哈希表直接秒杀啦. 昨天的笔试,还有刷的面经都有这道题...今天赶紧补补 ...

最新文章

  1. Strategy_Level2
  2. 嫌弃YouTube推荐算法,这位小哥决定自己动手写代码来推荐视频
  3. Spring Boot 应用系列 1 -- Spring Boot 2 整合Spring Data JPA和Druid,双数据源
  4. JavaScript学习总结(一)——ECMAScript、BOM、DOM(核心、浏览器对象模型与文档对象模型)...
  5. 中国高炉煤气脉冲袋式除尘器市场需求分析与竞争战略规划研究报告2022-2028年版
  6. 你必须失败---来自迈克尔·乔丹的6条教训
  7. 发送结构化数据Client端
  8. IIC通信---EEPROM24C02---STMF4
  9. python之路day4_python之路day4
  10. 作者:李俊清,山东农业大学副教授。
  11. VR有五种全局光照渲染引擎和各自的优缺点
  12. easypoi 导入失败返回错误文件_从Excel批量导入数据说到ForkJoin的原理
  13. scala调用java库_从scala调用java时的java.lang.IllegalAccessError – solutions / workarounds?...
  14. java hbase 例子,java操作hbase例子
  15. HDU1106 排序【字符串+整数+排序】
  16. Python源码深度解析—float空闲对象缓存池
  17. 计算机word表格平均分,Word表格自动求和_word求平均值 - 学无忧
  18. linux ext4 inode,Ext4文件系统中inode数量的限制
  19. @media用法解释
  20. 利用python进行正球面的大圆航程与横向线航程计算

热门文章

  1. Ubuntu双网卡绑定
  2. 洛谷P2671 求和 数学 前缀和
  3. 30分钟 带你浅入seajs源码
  4. 使用PHP输出中文JSON字符串
  5. mac Lion 10.7系统使用笔记
  6. Android应用方法数查看,查看size是否超过65k
  7. [2018.11.03 T3] 单调序列
  8. jemter java请求后置_jmeter完成一个java请求-本机调用
  9. html可以用坐标画svg图吗,html5教程-SVG基础 SVG坐标系统和图形转换
  10. 大学本科计算机考试小抄,大学考试竟允许光明正大打小抄你也考不过