【c++】只出现一次的数字I II III(三个版本:三道题)

news2024/9/8 23:12:16

 注:看这篇文章之前你需要了解& | ^ << >> 这五个运算符,此外,代码均经过测试运行通过

目录

1、只出现一次的数字I(难度:简单)

 2、只出现一次的数字II(难度:中等)

3、只出现一次的数字III(难度:中等)

4、 总结:


1、只出现一次的数字I(难度:简单)

题述: 

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

说明:

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

示例1:

输入:【2,2,1】

输出:1

题中已给:

class Solution {
public:
	int singleNumber(vector<int>& nums) {

	}
};

思路:

 ^异或操作符求解),^操作符我之前文章写过,请记下以下性质(假设A是一个数):

A^A=0   0^A=A

那就把数组中的数全都^一遍就能得到那个单独的数了

代码如下: 

class Solution {
public:
	int singleNumber(vector<int>& nums) {
		int val = 0;
		for (auto e : nums)
		{
			val ^= e;//与vector容器中的每个值^下
		}

		return val;
	}
};

 2、只出现一次的数字II(难度:中等)

题述: 

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

说明:

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

示例1:

输入:【2,2,3,2】

输出:3

题中已给:

class Solution {
public:
	int singleNumber(vector<int>& nums) {

	}
};

思路:

大体思路找出只出现一次的数对应的二进制位,找到后还原它即可

具体思路:

 ①、给定四个数,观察对应二进制位,得出出现一次的数对应的相加后的二进制位个数一定是3n+1

故我们先求出所有数32个位中每个位为1的个数 

 ②、32位中每个位,只要位为1的个数是3n+1,就说明他是那个出现一次的数的二进制位,那只要找出这些位,还原这个数即可,怎么还原?

运用 | (或运算)   或者 ^(异或运算)

代码如下: 

class Solution {
public:
	int singleNumber(vector<int>& nums) {
		//1、统计出所有数32个位中1出现的次数
		int bits[32] = { 0 };//储存32位的情况
		for (auto val : nums)
		{
			for (size_t i = 0; i < 32; ++i)
			{
				if ((val >> i) & 1)//或写为if(val & (1 << i))
				{//val的32位从低位到高位的每一位都判断是否存在1
				 //为真说明存在1,则bits数组对应++
					bits[i]++;
				}
				
			}
		}
		int num = 0;//要求的那个出现一次的数
		for (size_t i = 0; i < 32; ++i)
		{
			//次数为3N+1的位就是只出现一次的数为1的位
			if (bits[i] % 3 == 1)
			{
				//使num对应的二进制位变为只出现一次的数对应的二进制位
				num |= (1 << i);//或写为num ^= (1 << i);
			}
		}
		return num;
	}
};

时间复杂度分析:

 遍历vector中的每个数一次,故时间复杂度为O(N)

注意:其中遍历的32位是常数次,应该不算到时间复杂度中

3、只出现一次的数字III(难度:中等)

题述: 

给定一个整数数组nums,其中恰好有两个元素只出现一次,其余所有元素均出现两。找出只出现了一次的那两个元素。 

示例1:

输入:【1,2,1,3,2,5】

输出:【3,5】

说明:

①、结果输出的顺序并不重要,对于上面的例子,【5,3】也是正确答案

②、你的算法应该具有线性时间复杂度(O(N) ),你能否仅用常数空间复杂度来实现?

题中已给:

class Solution {
public:
	vector<int> singleNumber(vector<int>& nums) {

	}
};

思路:

这道题在我写^的文章中写过c语言版本的,思路都是一样的!

https://blog.csdn.net/m0_74044018/article/details/130195037

再说下思路:

1、所有数^后,结果就是只出现一次的两个数^后的结果,重点在于如何分离两个数

2、两个数既然不同,那么一定有一个二进制位(上下相对应的二进制位)不同,因为是^,不同的一位^结果一定为1,那我们只要找到一位为1的即可,用这个1来分离两个数到两组,我们假设这个二进制位是k

3、分为两组:k位为1的分为1组,k位为0的分为另一组,那么两个只出现一次的数一定被分到两组,而每一次都再^一遍,其他的出现两次的数一定会被^没,只会剩下那个只出现一次的数了

代码如下:

class Solution {
public:
	vector<int> singleNumber(vector<int>& nums) {
		//1、得出只出现一次的两个数^后的结果,val就是结果
		int val = 0;
		for (auto e : nums)
		{
			val ^= e;
		} 
		//2、随机找一个两个数不同的二进制位
		//二进制位不同则^后结果为1,故我们找个二进制位为1的即可
		size_t i = 0;
		for (; i < 32; ++i)
		{
			//找到一个二进制位为1的则break
			if (val & (1 << i))//找到的i就是对应第几位
				break;
		}
		//3、分离所有数为两组(那两个只出现一次的数肯定不在一组)
		int num1 = 0, num2 = 0;//储存只出现一次的两个数
		for (auto e : nums)
		{
			if (e & (1 << i))
				num1 ^= e;
			else
				num2 ^= e;
		}
		//4、按题目要求插入这两个数
		vector<int>v;
		v.push_back(num1);
		v.push_back(num2);

		return v;
	}
};

4、 总结:

凡是涉及到位运算的操作按顺序把下面的运算符拿出来套一下:

1、与、或(&   |)

2、异或(^)

3、取反(~)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/977953.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Ubuntu之apt-get系列--apt-get安装软件的方法/教程

原文网址&#xff1a;Ubuntu之apt-get系列--apt-get安装软件的方法/教程_IT利刃出鞘的博客-CSDN博客 简介 本文介绍Ubuntu使用apt-get安装软件的方法。 安装软件 先更新列表 sudo apt-get update 安装软件 sudo apt-get install <package name>[<version>]…

importlib的使用、9个视图子类、视图集、drf之路由、drf之请求响应回顾、GenericViewSet相关流程图

一 drf之请求响应回顾 # 1 drf请求-请求对象&#xff1a;data&#xff0c;query_params&#xff0c;其他跟之前一样&#xff0c;FILES-默认&#xff1a;支持三种编码-局部配置&#xff1a;视图类中-from rest_framework.parsers import JSONParser, FormParser, MultiPartPars…

MySQL的故事——MySQL架构与历史

MySQL架构与历史 文章目录 MySQL架构与历史一、MySQL逻辑架构二、并发控制三、事务四、多版本并发控制(MVCC) 一、MySQL逻辑架构 第一层&#xff1a;连接处理、授权认证、安全等等 第二层&#xff1a;查询解析、分析、优化、缓存以及所有的内置函数。包含跨存储引擎的功能&…

【数据结构与算法】十大经典排序算法

文章目录 前言一、常见十大排序算法总结1、名词解释2、时间复杂度 二、排序算法与C语言实现1、冒泡排序2、选择排序3、插入排序4、希尔排序5、归并排序6、快速排序7、堆排序8、计数排序9、桶排序10、基数排序 总结 前言 排序算法是《数据结构与算法》中最基本的算法之一。 排序…

java:操作cookie

背景 cookie 是一种客户端会话技术&#xff0c;将数据保存到客户端。主要流程就是&#xff1a; 1、服务器把数据设置到cookie并返回给浏览器 2、浏览器自动保存 3、浏览器下一次发送请求自动携带cookie给服务器 我们主要来看一下 java 是怎么操作 cookie 的。 cookie介绍 特…

区块链技术与应用 - 学习笔记2【密码学基础】

大家好&#xff0c;我是比特桃。本系列笔记只专注于探讨研究区块链技术原理&#xff0c;不做其他违反相关规定的讨论。 区块链技术已被纳入国家十四五规划&#xff0c;在“加快数字发展 建设数字中国”篇章中&#xff0c;区块链被列为“十四五”七大数字经济重点产业之一&#…

Node.js安装使用

目录 一、安装 Node.js二、环境变量配置三、npm常用命令 Node.js 是一个强大的运行时环境&#xff0c;它使您能够在服务器端运行 JavaScript 代码。它非常流行&#xff0c;用于构建 Web 应用程序、API 和各种后端服务。 一、安装 Node.js 1、访问 Node.js 官方网站。 在主页上…

算法训练day34|贪心算法 part03(LeetCode 1005.K次取反后最大化的数组和、134. 加油站、135. 分发糖果(处理一边再处理一边))

文章目录 1005.K次取反后最大化的数组和思路分析代码实现 134. 加油站暴力方法贪心方法 135. 分发糖果(处理一边再处理一边)思路分析代码实现思考总结 1005.K次取反后最大化的数组和 题目链接&#x1f525; 给定一个整数数组 A&#xff0c;我们只能用以下方法修改该数组&#…

使用redis实现队列功能

使用redis实现队列功能 操作方法描述LPUSHLong lPush(String key, String… values)将一个或多个值 value 插入到列表 key 的表头&#xff0c;返回插入后列表中value的数量&#xff0c;若key不存在&#xff0c;会创建一个新的列表并执行 LPUSH 操作RPOPLPUSHString rPopLPush(S…

hive安装步骤

centos7安装hive&#xff0c;hive版本3.1.2 一、环境准备 JDK版本&#xff1a;jdk-8u381 Hadoop版本&#xff1a;hadoop-3.1.3 MySQL版本&#xff1a;8.0.34 二、hive安装步骤 1.解压 将压缩包复制到/opt/software目录下&#xff0c;并解压至/opt/module/目录 tar -zxf…

bootstrap 导航栏下拉菜单,居右下拉菜单

<!DOCTYPE html> <html lang"en"> <head><!-- 新 Bootstrap5 核心 CSS 文件 --> <link rel"stylesheet" href"bootstrap-5.0.0-beta1-dist/css/bootstrap.min.css"><!-- 最新的 Bootstrap5 核心 JavaScript 文…

Ubuntu22.04 LTS 显卡相关命令

第一部分查看驱显卡信息 一、查看显卡型号 # -i表示不区分大小写 lspci | grep -i nvidia # 必须安装好nvidia驱动 nvidia-smi -L 二、查看显卡驱动版本 cat /proc/driver/nvidia/version 三、查看CUDA、cuDNN版本 # 或者 nvcc -V&#xff08;两个显示的版本一致&#xf…

指针和字符数组笔试题及其解析(第一组)

个人主页&#xff1a;Lei宝啊 愿所有美好如期而遇 前言&#xff1a; 数组名在寻常情况下表示首元素地址&#xff0c;但有两种情况例外&#xff1a; 1.sizeof(数组名)&#xff0c;这里的数组名表示整个数组&#xff0c;计算的是整个数组的大小 2.&数组名&#xff0c;这里的…

【KRouter】一个简单且轻量级的Kotlin Routing框架

【KRouter】一个简单且轻量级的Kotlin Routing框架 KRouter&#xff08;Kotlin-Router&#xff09;是一个简单而轻量级的Kotlin路由框架。 具体来说&#xff0c;KRouter是一个通过URI来发现接口实现类的框架。它的使用方式如下&#xff1a; val homeScreen KRouter.route&l…

C# PSO 粒子群优化算法 遗传算法 随机算法 求解复杂方程的最大、最小值

复杂方程可以自己定义&#xff0c;以下是看别人的题目&#xff0c;然后自己来做 以下是计算结果 private void GetMinResult(out double resultX1, out double min){double x1, result;Random random1 new Random(DateTime.Now.Millisecond* DateTime.Now.Second);min 99999…

创建MyBatis的映射文件模板

Settings->Editor->->Code Style->File and Code Templates <?xml version"1.0" encoding"UTF-8" ?> <!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dt…

tomcat部署、tomcat虚拟主机及tomcat多实例

目录 一、Tomcat概述 tomcat是什么&#xff1f; 什么是 servlet&#xff1f; 什么是 JSP? Tomcat 功能组件结构 Container 结构分析 Tomcat 请求过程 二、Tomcat部署 1、关闭防火墙和selinux&#xff0c;并将Tomcat所需软件包传到/opt目录下 2、安装JDK 3、设置JDK…

MATLAB 2022b 中设置关闭 MATLAB 之前进行询问

在 MATLAB 2022b 中可以进行设置&#xff0c;在关闭 MATLAB 之前进行询问&#xff0c;防止意外关闭 MATLAB。如图&#xff1a;

《Effective STL》读书笔记(一):容器

容器类型&#xff1a; 标准STL序列容器&#xff1a;vector, string, deque, list标准STL关联容器&#xff1a;set, multiset, map, multimap非标准序列容器slist和rope非标准关联容器&#xff1a;hash_set, hash_multiset, hash_map, hash_multimap标准的非STL容器&#xff1a…

LabVIEW利用纳米结构干电极控制神经肌肉活动

LabVIEW利用纳米结构干电极控制神经肌肉活动 随着人口老龄化&#xff0c;长期护理的必要性变得更加重要&#xff0c;医疗中心的压力开始达到惊人的水平。全球对所有社会和经济部门的认识对于更好地协调卫生和社会服务之间的护理以及为更多的院外治疗提供条件至关重要。 关于医…