《剑指offer》面试题56 - I. 数组中数字出现的次数
问题描述
一个整型数组 nums 里除两个数字之外,其他数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)。
示例 1:
输入:nums = [4,1,4,6]
输出:[1,6] 或 [6,1]
示例 2:
输入:nums = [1,2,10,4,1,4,3,3]
输出:[2,10] 或 [10,2]
限制:
2 <= nums <= 10000
代码
首先给一个时间复杂度\(O(N)\)空间复杂度\(O(N)\)的算法:
class Solution {
public:
vector<int> singleNumbers(vector<int>& nums) {
map<int,int> table;
vector<int> ans;
for(int& num:nums)
{
++table[num];
}
for(auto &num:table)
{
if(num.second == 1)ans.push_back(num.first);
}
return ans;
}
};
结果
执行用时 :164 ms, 在所有 C++ 提交中击败了5.22%的用户
内存消耗 :20.4 MB, 在所有 C++ 提交中击败了100.00%的用户
代码
再给一个时间复杂度\(O(N\log(N))\)空间复杂度\(O(1)\)的算法:
class Solution {
public:
vector<int> singleNumbers(vector<int>& nums) {
int i,n =nums.size();
if(n == 2)return nums;
vector<int> ans;
sort(nums.begin(),nums.end());
if(nums[0]!=nums[1])ans.push_back(nums[0]);
if(nums[n-1]!=nums[n-2])ans.push_back(nums[n-1]);
for(i = 1; i < n-1; ++i)
{
if(nums[i] != nums[i-1] && nums[i]!= nums[i+1])
ans.push_back(nums[i]);
}
return ans;
}
};
结果
执行用时 :76 ms, 在所有 C++ 提交中击败了14.53%的用户
内存消耗 :16.5 MB, 在所有 C++ 提交中击败了100.00%的用户
代码
最后给一个时间复杂度\(O(N)\)空间复杂度\(O(1)\)的算法:
class Solution {
public:
vector<int> singleNumbers(vector<int>& nums) {
int i,n =nums.size(),x = 0;
if(n == 2)return nums;
vector<int> ans(2,0);
//将其全部 '异或' 起来,我们知道相同的两个数 '异或' 的话为0,那么两个1都抵消了,就剩1和6 '异或' 起来
for(int &num:nums)
x ^= num;
//我们用 x &= -x 来取出最右端为 ‘1’ 的位,
x &= -x;
//目标数必然分散在两个数组中,而且相同的数必然落在同一个数组中,相当于求解两个从只有一个元素只出现一次,其余元素都出现两次的数组中找出这一个元素的问题
for(int &num:nums)
{
if(x & num)ans[0] ^= num;
else ans[1] ^= num;
}
return ans;
}
};
结果
执行用时 :36 ms, 在所有 C++ 提交中击败了64.01%的用户
内存消耗 :16.2 MB, 在所有 C++ 提交中击败了100.00%的用户
《剑指offer》面试题56 - I. 数组中数字出现的次数的更多相关文章
- Leetcode - 剑指offer 面试题29:数组中出现次数超过一半的数字及其变形(腾讯2015秋招 编程题4)
剑指offer 面试题29:数组中出现次数超过一半的数字 提交网址: http://www.nowcoder.com/practice/e8a1b01a2df14cb2b228b30ee6a92163 ...
- 面试题56 - I. 数组中数字出现的次数
面试题56 - I. 数组中数字出现的次数 一个整型数组 nums 里除两个数字之外,其他数字都出现了两次.请写程序找出这两个只出现一次的数字.要求时间复杂度是O(n),空间复杂度是O(1). 示例 ...
- LeetCode 面试题56 - I. 数组中数字出现的次数 | Python
面试题56 - I. 数组中数字出现的次数 题目 一个整型数组 nums 里除两个数字之外,其他数字都出现了两次.请写程序找出这两个只出现一次的数字.要求时间复杂度是O(n),空间复杂度是O(1). ...
- 力扣Leetcode 面试题56 - I. 数组中数字出现的次数
面试题56 - I. 数组中数字出现的次数 一个整型数组 nums 里除两个数字之外,其他数字都出现了两次.请写程序找出这两个只出现一次的数字.要求时间复杂度是O(n),空间复杂度是O(1). 示例 ...
- (python)剑指Offer 面试题51:数组中重复的数字
问题描述 在长度为n的数组中,所有的元素都是0到n-1的范围内. 数组中的某些数字是重复的,但不知道有几个重复的数字,也不知道重复了几次,请找出任意重复的数字. 例如,输入长度为7的数组{2,3,1, ...
- 剑指offer 面试题3:数组中重复的数字
题目描述 在一个长度为n的数组里的所有数字都在0到n-1的范围内. 数组中某些数字是重复的,但不知道有几个数字是重复的.也不知道每个数字重复几次.请找出数组中任意一个重复的数字. 例如,如果输入长度为 ...
- 《剑指offer》面试题56 - II. 数组中数字出现的次数 II
问题描述 在一个数组 nums 中除一个数字只出现一次之外,其他数字都出现了三次.请找出那个只出现一次的数字. 示例 1: 输入:nums = [3,4,3,3] 输出:4 示例 2: 输入:nums ...
- 剑指Offer面试题 二维数组中的查找
题目链接:https://www.nowcoder.com/questionTerminal/abc3fe2ce8e146608e868a70efebf62e 题目大意: 略 分析: 对萌醒很开拓思维 ...
- 剑指 Offer 56 - II. 数组中数字出现的次数 II + 位运算
剑指 Offer 56 - II. 数组中数字出现的次数 II Offer_56_2 题目详情 解题思路 java代码 package com.walegarrett.offer; /** * @Au ...
随机推荐
- uni-app + Cloudbase——uni-app 项目中如何使用腾讯云开发后端服务
1 基本介绍 uni-app 是一个基于 Vue.js 的跨端开发框架,一套代码可以发布到 App.小程序.Web 等不同平台 腾讯云开发平台 Cloudbase 提供的 @cloudbase/js- ...
- CF152A Marks 题解
Content 有 \(n\) 名学生考了 \(m\) 门科目,各得到了自己的成绩单.如果第 \(i\) 个学生的第 \(j\) 个科目的分数 \(a_{i,j}\) 在所有学生中是最高的,那么我们就 ...
- CF935B Fafa and the Gates 题解
Content 一个动点 \(F\) 一开始在平面直角坐标系上原点的位置,随后它会移动 \(n\) 次,每次只能向上走或者向右走 \(1\) 个单位,求经过直线 \(y=x\) 的次数. 数据范围:\ ...
- zabbix保姆级安装教程
安装步骤 1.进入官网选择下载的版本和服务器类型 官网地址:https://www.zabbix.com/cn/download?zabbix=5.0&os_distribution=cent ...
- Java面向对象~类和对象&方法,类方法
面向对象 概念: 1.同一类事物的抽象描述,不是具体的 2.类和对象的关系: 类 是抽象的. 对象 是具体的. 3.对象的体征,称为"属性&q ...
- centos7 升级php版本到7.2
#自带的只有5.4版本 yum provides php [root@localhost etc]# yum provides php Loaded plugins: fastestmirror, l ...
- Linux宝塔面板部署运行jar包
登录面板 安装插件 把jar包上传上去 设置jar包 填写项目启动的端口 然后点击确定 会自动启动 然后浏览器打开 ip:端口 即可
- 【剑指Offer】数据流中的中位数 解题报告(Python)
[剑指Offer]数据流中的中位数 解题报告(Python) 标签(空格分隔): 剑指Offer 题目地址:https://www.nowcoder.com/ta/coding-interviews ...
- idea使用教程-安装
[1]将安装包进行解压-->选择固态盘符 [2]发送到桌面快捷方式,生成一个快捷方式 [3]打开: 选择主题: 先进入再说,免费试用: 创建一个项目: 选择JDK: 找到jetbrains-ag ...
- Codeforces 1073D:Berland Fair(模拟)
time limit per test: 2 secondsmemory limit per test: 256 megabytesinput: standard inputoutput: stand ...