算法题每日一练---第46天:只出现一次的数字 l

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

7.png

一、问题描述

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


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


题目链接:只出现一次的数字


二、题目要求

样例 1

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


样例 2

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


考察

位运算异或、双指针、数学思想
建议用时15~30min


三、问题分析


本题是位运算的第1题,没了解过位运算相关知识点可以看这一篇文章:


算法题每日一练---第45天:位运算


1.双指针

一开始,我想的是先对数组从小到大排序。举两个例子,排序后如下:

112241233两两对比,因为排序后相等的数字都会聚集到一起,假如不相等就输出,OK!


classSolution {
public:
intsingleNumber(vector<int>&nums) {
inti=0,j=1,n=nums.size();//双指针i jsort(nums.begin(),nums.end());//排序while(i<n&&j<n)
        {
if(nums[i]!=nums[j])//不相等            {
returnnums[i];//直接返回结果            }
i+=2,j+=2;//向后顺延两个        }
returnnums[n-1];//输出最后一个    }
};


2.位运算


位运算一开始属实没想到,看了题解之后发现解法十分巧妙。


8.png

异或就是相同的两个数字会被消掉,异或运算满足交换律和结合律,比如:

4^1^2^1^2 = 1^1^2^2^4 = 0^0^4 = 4

结果就是最后一个没有被消掉的数字。


四、编码实现


classSolution {
public:
intsingleNumber(vector<int>&nums) {
inti=0,n=nums.size();//初始化for(i=1;i<n;i++)
       {
nums[i]=nums[i]^nums[i-1];//异或开始       }
returnnums[n-1];//输出结果};


五、测试结果9.png

相关文章
算法练习第九天——只出现一次的数字
给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
|
JavaScript 算法 前端开发
【前端算法】JS实现数字千分位格式化
JS实现数字千分位格式化的几种思路,以及它们之间的性能比较
283 1
|
存储 前端开发 算法
LeetCode只出现一次的数字使用JavaScript解题|前端学算法
LeetCode只出现一次的数字使用JavaScript解题|前端学算法
111 0
|
算法 PHP
力扣(LeetCode)算法题解:1365. 有多少小于当前数字的数字
力扣(LeetCode)算法题解:1365. 有多少小于当前数字的数字
110 0
|
算法 PHP
力扣(LeetCode)算法题解:1323. 6 和 9 组成的最大数字
力扣(LeetCode)算法题解:1323. 6 和 9 组成的最大数字
106 0
|
算法 PHP
力扣(LeetCode)算法题解:1295. 统计位数为偶数的数字
力扣(LeetCode)算法题解:1295. 统计位数为偶数的数字
87 0
|
算法 PHP
剑指Offer算法题解:56 - II. 数组中数字出现的次数 II
剑指Offer算法题解:56 - II. 数组中数字出现的次数 II
61 0
|
机器学习/深度学习 算法 数据建模
K近邻算法识别数字---OpenCV-Python开发指南(40)
K近邻算法识别数字---OpenCV-Python开发指南(40)
150 0
K近邻算法识别数字---OpenCV-Python开发指南(40)
|
机器学习/深度学习 存储 算法
算法打卡Day23_leetcode _136. 只出现一次的数字
算法打卡Day23_leetcode _136. 只出现一次的数字
算法打卡Day23_leetcode _136. 只出现一次的数字
|
存储 算法 Java
算法打卡Day5_lecode_448. 找到所有数组中消失的数字
算法打卡Day5_lecode_448. 找到所有数组中消失的数字
算法打卡Day5_lecode_448. 找到所有数组中消失的数字