1. 题目

1.1 英文题目

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

You must implement a solution with a linear runtime complexity and use only constant extra space.

1.2 中文题目

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

说明:

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

1.3输入输出

输入 输出
nums = [2,2,1] 4
nums = [4,1,2,1,2] 4
nums = [1] 1

1.4 约束条件

  • 1 <= nums.length <= 3 * 104
  • -3 * 104 <= nums[i] <= 3 * 104
  • Each element in the array appears twice except for one element which appears only once.

2. 分析

这一题我的第一反应是暴力搜索,先构建一个临时数组存储已遍历元素。若新遍历元素与之前重复,则不是目标值,从临时数组中删除;否则加入。遍历到最后,临时数组内只剩余目标值。代码如下:

class Solution {
public:
int singleNumber(vector<int>& nums) {
vector<int> temp;
vector<int>::iterator iter;
for (int i = 0; i < nums.size(); i++)
{
iter = find(temp.begin(), temp.end(), nums[i]);
if (iter != temp.end()) //找到了,重复元素
temp.erase(iter);
else
temp.push_back(nums[i]);
}
return temp[0];
}
};

之后又看了下一些其他大神们的写法,让人直呼妙哉!其中一种是利用set集合不含重复元素的性质,通过将数组转为集合,之后用集合元素和的2倍减去原数组所有元素的和,就是结果,代码如下:

class Solution {
public:
int singleNumber(vector<int>& nums) {
set<int> setNums(nums.begin(), nums.end());
int sum = accumulate(nums.begin(), nums.end(), 0);
int setSum = accumulate(setNums.begin(), setNums.end(), 0);
return 2 * setSum - sum;
}
};

上面这种算法在时间和空间消耗上并不是太好,但是这种想法不错。另外还有一种做法是利用异或的性质,假设所有的数组为:abcbcda,则

a ^ b ^ c ^ b ^ c ^ d ^ a

= a ^ a ^ b ^ b ^ c ^ c ^ d

= 0 ^ 0 ^ 0 ^ d

= d。

代码如下:

class Solution {
public:
int singleNumber(vector<int>& nums) {
int result = 0;
for (auto num : nums)
result ^= num;
return result;
}
};

3. 补充知识

(1)vector

a. 查找vector中的某一个元素

可以利用algorithm头文件中find(),用法为:

vector<A>::iterator iter = std::find(vec.begin(), vec.end(), findNum);

b.vector删减元素

  • push_back()尾部添加元素
  • pop_back()尾部删除元素
  • erase(num)删除指定元素或指定迭代器位置元素

c.vector与set互转

  • vector转set:set<int> st(v.begin(), v.end());//在构造函数中可以直接实现vector转set
  • set转vector:v.assign(st.begin(), st.end());

(2) 异或

a.异或的特性:

  • 恒定律:A ^ 0 = A
  • 归零率:A ^ A = 0
  • 交换律:A ^ B = B ^ A
  • 结合律:(A ^ B) ^ C = A ^ (B ^ C)

b.用途

异或可以快速比较两个值是否相等 a ^ b == 0,效率非常高,比 a - b == 0 高很多。

异或还能在不定义临时变量的情况下,交换两个值(经典题目)

a = a ^ b

b = a ^ b // a ^ b ^ b = a ^ 0 = a

a = a ^ b // a ^ b ^ a = b ^ 0 = b

参考:https://www.jianshu.com/p/e3442ed3d874

Leetcode No.136 Single Number(c++实现)的更多相关文章

  1. 【LeetCode】136. Single Number 解题报告(Java & Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 异或 字典 日期 [LeetCode] 题目地址:h ...

  2. 【LeetCode】136. Single Number (4 solutions)

    Single Number Given an array of integers, every element appears twice except for one. Find that sing ...

  3. LeetCode Problem 136:Single Number

    描述:Given an array of integers, every element appears twice except for one. Find that single one. Not ...

  4. 【一天一道LeetCode】#136. Single Number

    一天一道LeetCode 本系列文章已全部上传至我的github,地址:ZeeCoder's Github 欢迎大家关注我的新浪微博,我的新浪微博 欢迎转载,转载请注明出处 (一)题目 Given a ...

  5. LeetCode之136. Single Number

    -------------------------------------- 一个数异或它自己会得到0,0异或n会得到n,所以可以用异或来消除重复项. AC代码如下: public class Sol ...

  6. 【LeetCode】136. Single Number

    题目: Given an array of integers, every element appears twice except for one. Find that single one. No ...

  7. LeetCode 136. Single Number C++ 结题报告

    136. Single Number -- Easy 解答 相同的数,XOR 等于 0,所以,将所有的数字 XOR 就可以得到只出现一次的数 class Solution { public: int ...

  8. leetcode 136 Single Number, 260 Single Number III

    leetcode 136. Single Number Given an array of integers, every element appears twice except for one. ...

  9. LeetCode 136. Single Number(只出现一次的数字)

    LeetCode 136. Single Number(只出现一次的数字)

随机推荐

  1. 路由信息相关 route 网卡

    目录 route命令 1.查看路由表 2.管理路由 基本网络配置 添加网卡地址 修改网卡UUID route命令 路由表管理命令,路由表主要构成: Destination: 目标网络ID,表示可以到达 ...

  2. Gorm入门使用

    Gorm GORM CRUD 数据库的增删改查 go get -u github.com/jinzhu/gorm go get -u github.com/jinzhu/gorm/dialects/m ...

  3. NVIDIA安倍架构

    NVIDIA安倍架构 NVIDIA Ampere ArchitectureNVIDIA The Heart of the World's Highest-Performing, Elastic Dat ...

  4. gst-crypto GStreamer插件

    gst-crypto GStreamer插件 内容 1. gst-crypto概述 1.1gst-crypto GStreamer插件功能 1.2用例范例 2. GStreamer插件支持 3. 在本 ...

  5. 【NX二次开发】Block UI 超级截面

    属性说明 属性   类型   描述   常规           BlockID    String    控件ID    Enable    Logical    是否可操作    Group    ...

  6. 【SQLite】知识点概述

    1.SQLite不与诸如MySQL,Oracle,PostgreSQL或SQL Server之类的客户端/服务器SQL数据库引擎竞争,SQLite与fopen()竞争,读写快35%.2.SQLite数 ...

  7. Pytorch CNN网络MNIST数字识别 [超详细记录] 学习笔记(三)

    目录 1. 准备数据集 1.1 MNIST数据集获取: 1.2 程序部分 2. 设计网络结构 2.1 网络设计 2.2 程序部分 3. 迭代训练 4. 测试集预测部分 5. 全部代码 1. 准备数据集 ...

  8. Android一个炫酷的树状图组织架构图开源控件实现过程

    Android一个炫酷的树状图组织架构图开源控件 文章目录 [1 简介] [2 效果展示] [3 使用步骤] [4 实现基本布局流程] [5 实现自由放缩及拖动] [6 实现添加删除及节点动画] [7 ...

  9. ANDROID开发 Fatal signal 11(SIGSEGV) at 0x问题解决方案

    最近做ANDROID开发,也遇到了很多程序员遇到的一个问题:FATAL SIGNAL 11(SIGSEGV) at 0xxxxx,自然是各种搜索是否有人已然解决,虽然搜索出来的已有案例不少,基本都是内 ...

  10. 获取微信公众号的粉丝openid以及用openid获取unionID

    第一步获取微信粉丝的openid https://api.weixin.qq.com/cgi-bin/user/get?access_token=access_token access_token这里 ...