1.解答前的碎碎念:

这个系列是写给找工作前的我看的,毕竟作为一个记性很差的人,可能过一段时间又忘了怎么写了。。。然后作为开胃菜的第一题就没有思路,真的是让人非常有挫败感了。。。

2.问题描述:

给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。

说明:

你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?

示例 1:

输入: [2,2,1]
输出: 1

示例 2:

输入: [4,1,2,1,2]
输出: 4

3.解题思路:

解题思路来源于此链接:https://cuijiahua.com/blog/2018/01/basis_40.html

以下是有用内容的摘录:

大家首先想到的是顺序扫描法,但是这种方法的时间复杂度是O(n^2)。接着大家又会考虑用哈希表的方法,但是空间复杂度不是O(1)。

应该怎么做才能即满足时间复杂度是O(n)又满足空间复杂度是O(1)的要求呢?

我们可以想一想“异或”运算的一个性质,我们直接举例说明。

举例:{2,4,3,6,3,2,5,5}

这个数组中只出现一次的两个数分别是4和6。怎么找到这个两个数字呢?

我们先不看找到俩个的情况,先看这样一个问题,如何在一个数组中找到一个只出现一次的数字呢?比如数组:{4,5,5},唯一一个只出现一次的数字是4。

我们知道异或的一个性质是:任何一个数字异或它自己都等于0。也就是说,如果我们从头到尾依次异或数组中的每一个数字,那么最终的结果刚好是那个只出现一次的数字。比如数组{4,5,5},我们先用数组中的第一个元素4(二进制形式:0100)和数组中的第二个元素5(二进制形式:0101)进行异或操作,0100和0101异或得到0001,用这个得到的元素与数组中的三个元素5(二进制形式:0101)进行异或操作,0001和0101异或得到0100,正好是结果数字4。这是因为数组中相同的元素异或是为0的,因此就只剩下那个不成对的孤苦伶仃元素。

4.相关知识:

位运算小结(按位与、按位或、按位异或、取反、左移、右移):https://blog.csdn.net/mengzhengjie/article/details/80611422

摘录:

按位异或(^)

参加运算的两个数,换算为二进制(0、1)后,进行异或运算。只有当相应位上的数字不相同时,该为才取1,若相同,即为0。

1

2

3

4

5

6

将10与-10进行按位异或(^)运算:

0000 0000 0000 1010

1111 1111 1111 0110

-----------------------

1111 1111 1111 1100

所以:10 ^ -10 = 1111 1111 1111 1100

可以看出,任何数与0异或,结果都是其本身。利用异或还可以实现一个很好的交换算法,用于交换两个数,算法如下:

1

2

3

a = a ^ b;

b = b ^ a;

a = a ^ b;

5.答案:

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

2018年LeetCode高频算法面试题刷题笔记——只出现一次的数字(开始之前)相关推荐

  1. 一周刷爆LeetCode,算法da神左神(左程云)耗时100天打造算法与数据结构基础到高级全家桶教程,直击BTAJ等一线大厂必问算法面试题真题详解 笔记

    一周刷爆LeetCode,算法大神左神(左程云)耗时100天打造算法与数据结构基础到高级全家桶教程,直击BTAJ等一线大厂必问算法面试题真题详解 笔记 教程与代码地址 P1 出圈了!讲课之外我们来聊聊 ...

  2. 力扣高频|算法面试题汇总(七):树

    力扣高频|算法面试题汇总(一):开始之前 力扣高频|算法面试题汇总(二):字符串 力扣高频|算法面试题汇总(三):数组 力扣高频|算法面试题汇总(四):堆.栈与队列 力扣高频|算法面试题汇总(五):链 ...

  3. LeetCode《算法入门》刷题笔记(31 题全)

    LeetCode<算法入门>刷题笔记(31 题全) 二分查找 1. 二分查找 _解法1:二分搜索(迭代) 解法2:二分搜索(递归) 2. 第一个错误的版本 _解法1:二分 3. 搜索插入位 ...

  4. 2018 年力扣高频算法面试题汇总-难题记录-鸡蛋掉落

    题目描述: 你将获得 K 个鸡蛋,并可以使用一栋从 1 到 N  共有 N 层楼的建筑. 每个蛋的功能都是一样的,如果一个蛋碎了,你就不能再把它掉下去. 你知道存在楼层 F ,满足 0 <= F ...

  5. 高频算法面试题(字符串) 242. 有效的字母异位词

    leetcode 242. 有效的字母异位词 给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的一个字母异位词. 示例 1: 输入: s = "anagram", ...

  6. PHP面试高频算法面试题 -- 判断链表是否有环

    题目:给定一个链表,判断链表中是否有环. 关联力扣141题目 https://leetcode-cn.com/problems/linked-list-cycle/ 题解: PHP题解 functio ...

  7. 牛客华为机试题刷题笔记总结[103题更新完毕才收尾,建议关注收藏]

    面试题链接

  8. python刷题笔记怎么改_python面试题刷题笔记1 - 10

    函数参数传递:对象分为多变的对象和不变的对象.在python中,字符串.元组数字是不变的对象.列表,dict类型.设置等改变的对象.当引用传递给一个函数,函数的一个副本参考自动复制.这个函数的引用无关 ...

  9. Leetcode刷题笔记——剑指 Offer 46. 把数字翻译成字符串(中等)

    文章目录 题目描述 解法:动态规划 方法一:字符串遍历 复杂度分析 C++代码实现 方法二:数字求余 复杂度分析 C++代码实现 参考链接 题目描述 给定一个数字,我们按照如下规则把它翻译为字符串:0 ...

最新文章

  1. mysql 让别人连接我的数据库
  2. python字典增加和删除_Python字典的基本用法实例分析【创建、增加、获取、修改、删除】...
  3. 工业互联网 — 5G 与 IIoT
  4. 2021浙江英语高考成绩查询,2021浙江高考英语试卷难度如何
  5. 网页设计如何排成一列_网页设计如何影响以及改善SEO?
  6. 屠呦呦3年后再上热搜:女先生,世无双!
  7. 3月2日,阿里云开源 PolarDB 企业级架构即将发布
  8. freemaker .flt文件自动换行的问题,map循环获取key和value
  9. C++学习笔记-继承
  10. 客户区和非客户区指的什么?窗口客户区和视图客户区的区别(小问题大思想)
  11. 培养逻辑思维的app_数学逻辑思维app哪个好
  12. echarts---圆饼图
  13. vue 音乐进度条拖拽
  14. 【HoloLens2】HoloLens中如何操控自制的3D模型(移动、缩放、旋转)
  15. 日本动画现状“我是一个前动画师,有什么要问的”
  16. ubuntu光盘定制化(在系统ISO里装自定义软件)
  17. R中Warning message:Computation failed in stat_stratum():could not find function “default_missing“
  18. 免费 SSL 安全证书
  19. win7引导安装ubuntu无需U盘启动
  20. Prenetics拟赴美上市:预计2021年收入翻两倍,阿里、平安均为股东

热门文章

  1. 用C语言创作睿智小游戏——猜拳篇
  2. 风机变桨控制FAST与MATLAB SIMULINK联合仿真模型非线性风力发电机的
  3. 我的世界服务器地皮系统指令教程,我的世界plotme地皮插件指令大全
  4. PCI网卡上扩展ROM编程 3.基址寄存器
  5. 土方工程量计算表格excel_挖填土方量计算方法(Excel)
  6. 深度学习学习笔记——optimizer里的computer_gradients和apply_gradients和tape的函数gradient
  7. 胡珈魁:00后工程师的AI进阶之路 | OneFlow U
  8. 随机过程的各态历经性
  9. 关于无穷递降法的一个题目(证n不是完全立方数,则开立方n是无理数)
  10. 黑马程序员-Java基础:设计模式总结