Leetcode No.136 Single Number(c++实现)
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++实现)的更多相关文章
- 【LeetCode】136. Single Number 解题报告(Java & Python)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 异或 字典 日期 [LeetCode] 题目地址:h ...
- 【LeetCode】136. Single Number (4 solutions)
Single Number Given an array of integers, every element appears twice except for one. Find that sing ...
- LeetCode Problem 136:Single Number
描述:Given an array of integers, every element appears twice except for one. Find that single one. Not ...
- 【一天一道LeetCode】#136. Single Number
一天一道LeetCode 本系列文章已全部上传至我的github,地址:ZeeCoder's Github 欢迎大家关注我的新浪微博,我的新浪微博 欢迎转载,转载请注明出处 (一)题目 Given a ...
- LeetCode之136. Single Number
-------------------------------------- 一个数异或它自己会得到0,0异或n会得到n,所以可以用异或来消除重复项. AC代码如下: public class Sol ...
- 【LeetCode】136. Single Number
题目: Given an array of integers, every element appears twice except for one. Find that single one. No ...
- LeetCode 136. Single Number C++ 结题报告
136. Single Number -- Easy 解答 相同的数,XOR 等于 0,所以,将所有的数字 XOR 就可以得到只出现一次的数 class Solution { public: int ...
- leetcode 136 Single Number, 260 Single Number III
leetcode 136. Single Number Given an array of integers, every element appears twice except for one. ...
- LeetCode 136. Single Number(只出现一次的数字)
LeetCode 136. Single Number(只出现一次的数字)
随机推荐
- android Room数据库仓库模式
- Python小白的数学建模课-05.0-1规划
0-1 规划不仅是数模竞赛中的常见题型,也具有重要的现实意义. 双十一促销中网购平台要求二选一,就是互斥的决策问题,可以用 0-1规划建模. 小白学习 0-1 规划,首先要学会识别 0-1规划,学习将 ...
- Go语言网络通信---TCP通信上传一个小文件
server: package main import ( "fmt" "net" "os" ) func SHandleError(err ...
- TVM Pass IR如何使用
TVM Pass IR如何使用 随着Relay / tir中优化遍数的增加,执行并手动维护其依赖关系变得很棘手.引入了一个基础结构来管理优化过程,并应用于TVM堆栈中IR的不同层. Relay / t ...
- flume采集MongoDB数据到Kafka中
环境说明 centos7(运行于vbox虚拟机) flume1.9.0(自定义了flume连接mongodb的source插件) jdk1.8 kafka(2.11) zookeeper(3.57) ...
- Druid数据库连接池基本使用
一.导入Druid的jar包和数据库驱动jar包 二.定义配置文件 与c3p0不同,Druid的配置文件是properties形式的.而且Druid不像c3p0那样可以自动加载配置文件,Druid需要 ...
- P5960 【模板】差分约束算法
题目描述 给出一组包含 $m$ 个不等式,有 $n$ 个未知数的形如: 的不等式组,求任意一组满足这个不等式组的解. 输入格式 第一行为两个正整数 $n,m$,代表未知数的数量和不等式的数量. 接下来 ...
- Filebrowser 安装简介
官网地址: https://filebrowser.org https://github.com/filebrowser/filebrowser 官网安装方法: curl -fsSL https:// ...
- 【NX二次开发】Block UI 双精度表
属性说明 常规 类型 描述 BlockID String 控件ID Enable Logical 是否可操作 Group Logical ...
- 搭建简单模型训练MNIST数据集
# -*- coding = utf-8 -*- # @Time : 2021/3/16 # @Author : pistachio # @File : test1.py # @Software : ...