问题描述

一个整型数组 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. 数组中数字出现的次数的更多相关文章

  1. Leetcode - 剑指offer 面试题29:数组中出现次数超过一半的数字及其变形(腾讯2015秋招 编程题4)

    剑指offer 面试题29:数组中出现次数超过一半的数字 提交网址: http://www.nowcoder.com/practice/e8a1b01a2df14cb2b228b30ee6a92163 ...

  2. 面试题56 - I. 数组中数字出现的次数

    面试题56 - I. 数组中数字出现的次数 一个整型数组 nums 里除两个数字之外,其他数字都出现了两次.请写程序找出这两个只出现一次的数字.要求时间复杂度是O(n),空间复杂度是O(1). 示例 ...

  3. LeetCode 面试题56 - I. 数组中数字出现的次数 | Python

    面试题56 - I. 数组中数字出现的次数 题目 一个整型数组 nums 里除两个数字之外,其他数字都出现了两次.请写程序找出这两个只出现一次的数字.要求时间复杂度是O(n),空间复杂度是O(1). ...

  4. 力扣Leetcode 面试题56 - I. 数组中数字出现的次数

    面试题56 - I. 数组中数字出现的次数 一个整型数组 nums 里除两个数字之外,其他数字都出现了两次.请写程序找出这两个只出现一次的数字.要求时间复杂度是O(n),空间复杂度是O(1). 示例 ...

  5. (python)剑指Offer 面试题51:数组中重复的数字

    问题描述 在长度为n的数组中,所有的元素都是0到n-1的范围内. 数组中的某些数字是重复的,但不知道有几个重复的数字,也不知道重复了几次,请找出任意重复的数字. 例如,输入长度为7的数组{2,3,1, ...

  6. 剑指offer 面试题3:数组中重复的数字

    题目描述 在一个长度为n的数组里的所有数字都在0到n-1的范围内. 数组中某些数字是重复的,但不知道有几个数字是重复的.也不知道每个数字重复几次.请找出数组中任意一个重复的数字. 例如,如果输入长度为 ...

  7. 《剑指offer》面试题56 - II. 数组中数字出现的次数 II

    问题描述 在一个数组 nums 中除一个数字只出现一次之外,其他数字都出现了三次.请找出那个只出现一次的数字. 示例 1: 输入:nums = [3,4,3,3] 输出:4 示例 2: 输入:nums ...

  8. 剑指Offer面试题 二维数组中的查找

    题目链接:https://www.nowcoder.com/questionTerminal/abc3fe2ce8e146608e868a70efebf62e 题目大意: 略 分析: 对萌醒很开拓思维 ...

  9. 剑指 Offer 56 - II. 数组中数字出现的次数 II + 位运算

    剑指 Offer 56 - II. 数组中数字出现的次数 II Offer_56_2 题目详情 解题思路 java代码 package com.walegarrett.offer; /** * @Au ...

随机推荐

  1. Linux中find命令与三剑客之grep和正则

    昨日内容回顾 1.每个月的3号.5号和15号,且这天时周六时 执行 00 00 3,5,15 * 6 2.每天的3点到15点,每隔3分钟执行一次 */3 3-15 * * * 3.每周六早上2点半执行 ...

  2. 12 - Vue3 UI Framework - 打包发布

    基础组件库先做到这个阶段,后面我会继续新增.完善 接下来,我们对之前做的组件进行打包发布到 npm 返回阅读列表点击 这里 组件库优化 通用层叠样式表 我想大家都注意到了,前面我们在写组件的时候,sc ...

  3. jQuery Validate表单验证判断是否验证通过

    只判断某个字段是否验证通过,可以参考:https://www.cnblogs.com/pxblog/p/13801171.html <form action="" metho ...

  4. C++实现二叉搜索书(参考算法导论)

    1 #include <iostream> 2 using namespace std; 3 4 struct node 5 { 6 // 数据域 7 int data; 8 9 // 左 ...

  5. Simple16 字符压缩

    #define S16_NUMSIZE 16 #define S16_BITSSIZE 28 #define Simple16_Mask 0x7FFFFFFF extern int S16_NUM[] ...

  6. 定义Anroid SO崩溃位置

    E:\android-ndk-r13b\toolchains\arm-linux-androideabi-4.9\prebuilt\windows-x86_64\bin> arm-linux-a ...

  7. Lucky7(hdu5768)

    Lucky7 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Subm ...

  8. C++中常用的数学函数总结

    我们在C++程序设计的过程中往往会使用到一些数学函数,那么不同的数学运算要用到什么函数哪?大家可以参考我的总结如下: 首先引用到数学函数时一定要记得加函数头文件 #include<cmath&g ...

  9. ON LARGE BATCH TRAINING FOR DEEP LEARNING: GENERALIZATION GAP AND SHARP MINIMA

    目录 概 主要内容 一些解决办法 Keskar N S, Mudigere D, Nocedal J, et al. On Large-Batch Training for Deep Learning ...

  10. request参数获取,参数校验,参数处理

    需求: 1.post接口,需要在过滤器中进行参数校验,校验通过之后再执行方法 2.原有代码中使用x-www-form-urlencoded传参,新需求要使用json格式 3.原有代码校验过滤器使用Se ...