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

目录

1、力扣136. 只出现一次的数字

 2、 只出现一次的数字 II

3、只出现一次的数字 III


1、力扣136. 只出现一次的数字

解题思路:

 ^异或操作符求解),^操作符我之前文章写过,请记下以下性质(假设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

解题思路:

理解方式①:

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

具体思路:

 ①、给定四个数,观察对应二进制位,得出出现一次的数对应的相加后的二进制位个数一定是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;
	}
};

理解方式②:

class Solution {
public:
	int singleNumber(vector<int>& nums) {
        int ret = 0;
        //依次修改每个二进制位
        for (int i = 0; i < 32; i++)
        {
            int sum = 0;//计算所有数每个二进制位的和
            for (auto x : nums) 
                sum += x >> i & 1;//获取第i位的二进制位
            sum %= 3;
            if (sum == 1) ret |= 1 << i;//把第i为修改为1
        }
        return ret;
	}
};

3、只出现一次的数字 III

 

解题思路:

这道题在我写^的文章中写过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)
			if (val & (1 << i)) break;	//找到一个二进制位为1的则break,找到的i就是对应第几位

		//3、分离所有数为两组(那两个只出现一次的数肯定不在一组)
		int num1 = 0, num2 = 0;//储存只出现一次的两个数
		for (auto e : nums)
		{//第i位为1的为一组,为0的为另一组
			if (e & (1 << i)) num1 ^= e;
			else num2 ^= e;
		}
        return {num1, num2};
	}
};

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
<br/>(一)光盘内容:<br/><br/>本光盘的目录结构如下:<br/><br/>\(根目录)<br/>|<br/>|————Readme.txt+<br/>|<br/>|————\本书大案例(目录,存放本书重点讨论的大案例FSS的相关材料)<br/>| |<br/>|————|————DataBase(目录,存放大案例的数据库文件)<br/>| | <br/>|————|————Source(目录,大案例FSS源代码)<br/>| |<br/>|————|————|————NServer(目录,大案例FSS服务器端源程序)<br/>| | |<br/>|————|————|————NClient(目录,大案例FSS客户器端源程序)<br/>| <br/>|————|————EXE(目录,大案例FSS可执行程序)<br/>| | |<br/>|————|————|————NServer(目录,大案例FSS服务器可执行程序)<br/>| | |<br/>|————|————|————NClient(目录,大案例FSSS客户器可执行程序)<br/>|<br/>|————\本书小例程(目录,下面存放与本书小例程的源代码)<br/>| |<br/>|————|————\API绘图小例程(目录,存放API绘图小例程的相关文件)<br/>| | |<br/>|————|————|————DataBase(目录)<br/>| | | <br/>|————|————|————Materials(目录,存放API绘图小例程有关素材,比如图片等)<br/>| | |<br/>|————|————|————Source(目录,存放API绘图小例程源代码)<br/>| | |<br/>|————|————|————EXE(目录,存放API绘图小例程可执行文件)<br/>| | |<br/>|————|————|————Setup(目录)<br/>| | |<br/>|————|————\WAV文件操作小例程(目录,存放WAV文件操作小例程的相关文件)<br/>| | |<br/>|————|————|————DataBase(目录)<br/>| | | <br/>|————|————|————Materials(目录,存放WAV文件操作小例程有关素材,比如声音等)<br/>| | |<br/>|————|————|————Source(目录,存放WAV文件操作小例程源代码)<br/>| | |<br/>|————|————|————EXE(目录,存放WAV文件操作小例程可执行文件)<br/>| | |<br/>|————|————|————Setup(目录)<br/>| | |<br/>|————|————\换肤程序小例程(目录,存放换肤程序的相关文件)<br/>| | |<br/>|————|————|————DataBase(目录)<br/>| | | <br/>|————|————|————Materials(目录,存放换肤程序小例程有关素材,比如图片等)<br/>| | |<br/>|————|————|————Source(目录,存放换肤程序小例程源代码)<br/>| | |<br/>|————|————|————EXE(目录,存放换肤程序小例程可执行文件)<br/>| | |<br/>|————|————|————Setup(目录)<br/>| | |<br/>|————|————\网络对聊小例程(目录,存放网络对聊小例程的相关文件)<br/>| | |<br/>|————|————|————DataBase(目录)<br/>| | | <br/>|————|————|————Materials(目录)<br/>| | |<br/>|————|————|————Source(目录,存放网络对聊小例程源代码)<br/>| | | |<br/>|————|————|————|————NServer(目录,存放网络对聊小例程服务器端源代码)<br/>| | | |<br/>|————|————|————|————NClient(目录,存放网络对聊小例程客户端源代码)<br/>| | | <br/>|————|————|————EXE(目录,存放网络对聊小例程可执行文件)<br/>| | |<br/>|————|————|————|————NServer(目录,存放网络对聊小例程服务器端可执行文件)<br/>| | | |<br/>|————|————|————|————NClient(目录,存放网络对聊小例程客户端可执行文件)<br/>| | |<br/>|————|————|————Setup(目录)<br/>| | |<br/>|————|————\用户信息管理小例程(目录,存放用户信息管理小例程的相关文件)<br/>| | |<br/>|————|————|————DataBase(目录,存放用户信息管理小例程的数据库文件)<br/>| | | <br/>|————|————|————Materials(目录)<br/>| | |<br/>|————|————|————Source(目录,存放用户信息管理小例程源代码)<br/>| | |<br/>|————|————|————EXE(目录,存放用户信息管理小例程可执行文件)<br/>| | |<br/>|————|————|————Setup(目录)<br/>| | |<br/>|————|————\注册表操作小例程(目录,存放注册表操作小例程的相关文件)<br/>| | |<br/>|————|————|————DataBase(目录)<br/>| | | <br/>|————|————|————Materials(目录)<br/>| | |<br/>|————|————|————Source(目录,存放注册表操作小例程源代码)<br/>| | |<br/>|————|————|————EXE(目录,存放注册表操作小例程可执行文件)<br/>| | |<br/>|————|————|————Setup(目录)<br/>| | |<br/><br/>其中目录“本书大案例”包含本书最大案例FSS的所有服务器端和客户端的代<br/>码。读者朋友可以在本书中看到具体的代码分析。“本书大案例\DATABASE\<br/>MyServer.bak”文件是大案例FSS服务器端的数据库备份文件。读者只要在将<br/>这个文件还原到SQL SERVER2000中即可。<br/><br/><br/>(二)使用方法<br/>读者在使用这些光盘文件之前,首先确保系统已经成功安装了SQL SERVER2000和<br/>VC++6.0版本。这两个软件的安装在书中均有介绍。读者然后可以将光盘中的所有<br/>文件复制到硬盘的某一目录(如c:\book)下,即可直接运行。光盘中的实例<br/>VC++6.0环境下测试通过,在Windows 2000环境下也完全可以运行,所有源代码可<br/>以在VC++6.0下重新编译运行。<br/><br/><br/>(三)系统需求:<br/><br/>1. 硬件要求:<br/><br/>首先需要检查的是自己的计算机配置是否能够运行Microsoft的SQL SERVER和<br/>VC++6.0,在Microsoft的网站上提出如下要求:<br/>¢ CPU:Intel Pentium II-class 300 MHz<br/> (Intel Pentium III-class 600 MHz recommended)<br/> 这表明需要至少300MHz的奔III处理器,笔者所使用的是Pentium III667,<br/>运行起来性能还可以的,能顺利完成工作。<br/><br/>¢ RAM:96MB(128MB recommended)<br/> 实际上,128M内存运行起来还是觉得不够,最好能够有256M以上内存。<br/><br/>¢ Video:800×600,256 colors<br/> 只要是14英寸显示器就可以达到这个要求。<br/><br/>¢ CD-ROM:required<br/> 这只是目前计算机的标准配置,实际上,如果不是采用光盘安装的话,<br/>CD-ROM根本就派不上用场。<br/><br/>¢ Operating System:Microsoft Windows 2000(or up)<br/><br/>¢ Microsoft VC++6.0<br/><br/><br/>2. 基本软件要求:<br/><br/>如果读者使用的是Windows 98或Windows NT 4.0,就需要升级自己的系统到<br/>Windows2000的要求以安装VC++6.0和SQL SERVER 2000。笔者所使用的是<br/>Windows 2000.<br/><br/>3. 其他软件要求:(不一定需要)<br/>PHOTOSHOP:我们可以用这个来制作一些精美的图片美化我们的程序。虽然我们不是<br/>专业的美工,但据笔者所知,很多的程序员都会自己做一些图片。<br/><br/>联系信息:<br/>作者:林青松(一崖)(技术支持及相关问探讨)<br/>电子邮件:linqs@163.com
目录 I. 目录 1 II. java c/cpp互相调用实例(姊妹篇之一)——java调用c/cpp 4 一 先制作一个系统中有的DLL文件(cpp给出的sdk接口) 4 二 JNI 7 1、 编写java文件 7 2、 生成.h头文件 8 3、 用c/cpp实现这个头文件 9 三 测试 10 四 最后补充 11 III. java c/cpp互相调用实例(姊妹篇之二)——c/cpp调用java 11 一、 编写java代码 12 二、 编译java代码 12 三、 编写 C/C++ 代码 13 四、 运行exe 18 IV. Java JNI 编程进阶 18 一、 解决性能问 18 二、 解决本机平台接口调用问 19 三、 嵌入式开发应用(JNI小例子) 20 1、 新增一个基础类 22 2、 定义新类继承基础类 23 3、 编写调用类 23 4、 新增两个本地方法 24 5、 修改 RunMain 类 25 6、 新增一个方法处理java对象 26 7、 新增一个方法处理数组 29 8、 改写RunMain 32 四、 参考资料: 33 V. Eclipse+CDT+MinGW 进行JAVA调用C/C++ 34 一、 安装eclipse3.2。 34 二、 安装MinGW。 34 1、 下载MinGW 34 2、 安装 34 3、 安装版本 34 4、 选择安装的编译器 34 5、 选择安装路径,下一步 35 6、 等待下载软件 35 三、 MinGW的环境变量设置 35 1、 设置Path 35 2、 设置C_INCLUDE_PATH 35 3、 设置CPLUS_INCLUDE_PATH 35 四、 做一个小技巧修改 35 五、 安装CDT插件 36 1、 下载CDT插件 36 2、 安装CDT插件 36 六、 简单介绍CDT的使用吧 36 1、 新建一个C++项目 36 2、 输入New Project名字 36 3、 给项目新建一个的源文件 36 4、 接着出现文件添加的窗口,在File Name栏里面写上文件名 36 5、 编辑hello.cpp 37 6、 添加一个编译命令 37 七、 让我们开始进入真正的工作吧! 38 The Java side 38 1、 建立Java工程JavaHello,编写java类 38 2、 用命令生成头文件 38 The C side-Compiling the Library 40 1、 建立标准C工程Cpro,并生成dll文件 40 1) 将生成的头文件test_Hello.h拷贝到C工程Cpro下 40 2) 编写C类Hello.c,内容为: 40 3) 在C工程Cpro下建立hello.def文件(用于定义导出的函数),内容为: 40 4) 在C工程Cpro下建立makefile文件,内容为: 40 5) Make Targets 40 6) Make Targets视图下双击step1,在C工程Cpro下生成hello.o 文件。 41 7) Make Targets视图下双击step1,在C工程Cpro下生成hello.dll 文件。 41 2、 JAVA调用DLL 41 1) 将hello.dll拷贝到Java工程JavaHello下。 41 2) 运行Hello.java,则可以看到输出结果: 41 1) 将Hello.c改为Hello.cpp 41 2) 将makefile内容改为: 41 3) 其他的几乎都不用改变也可以。 42 评论: 42 VI. c++如何调用java程序 51 DemoMain.java内容如: 51 采用vc6++ IDE,采用JNI技术实现。 51 1、 编译时 51 2、 运行时 51 程序的关键在 53 VII. JNI 53 一、 定义 53 二、 设计目的 54 三、 书写步骤 54 1) 编写java程序:这里以HelloWorld为例。 54 2) 编译 55 3) 生成扩展名为h的头文件 55 4) 编写本地方法实现和由javah命令生成的头文件里面声明的方法名相同的方法。 56 5) 生成动态库 56 6) 运行程序 java HelloWorld就ok. 56 四、 调用中考虑的问 56 1) java和c是如何互通的? 57 2) 如何将java传入的String参数转换为c的char*,然后使用? 57 3) 将c中获取的一个char*的buffer传递给java? 57 4) 不知道占用多少空间的buffer,如何传递出去呢? 58 五、 对JAVA传入数据的处理 58 1) 如果传入的是bytearray的话,作如下处理得到buffer: 58 VIII. C/C++调用JAVA类 58 一、 加载虚拟机: 59 二、 获取指定对象的类定义: 59 三、 获取要调用的方法: 59 四、 调用JAVA类方法: 60 五、 获得类属性的定义: 60 六、 数组处理: 60 七、 异常: 60 八、 多线程调用 61 Java代码 61 命令行运行:javap -s -p MyTest ,输出: 62 C代码testjava.c: 62 编译: 65 运行结果: 65
C++商品管理系统50页报告+源码。代码详细并且功能完善。 本系统要求实现商品管理、用户管理、商品购买/退货管理等日常管理工作,以提高工作效率和管理水平。 系统合法普通用户分为用户(买家)和系统管理员,其中,系统管理员负责用户管理和商品管理,用户可以购买/退货管理。本设计要求实现的功能较多,所以将它们分为三个部分来叙述。 商品库存管理系统分为三个主要的功能模块: (1)商品管理模块:包括6个子模块,分别是商品入库模块、商品出库模块、删除商品模块、修改商品模块、查询商品模块和显示商品模块; I商品入库模块:首先自动显示系统中已有的商品信息,如果还没有商品,显示没有记录。提示用户是否需要入库,用户输入需要入库的商品编号,系统自动判断该商品是否已经存在,若存在则无法入库;若不存在,则提示用户输入商品的相关信息,一条商品的所有信息均输入完成之后,系统还会询问是否继续进行其他商品的入库操作。 II商品出库模块:首先自动显示系统中已有的商品信息,并提示用户输入需要出库的商品编号,系统自动判断该商品是否已经存在,若存在则提示用户输入出库的数量;若不存在,则提示用户找不到该商品,无法进行出库操作。I III删除商品模块:首先自动显示系统中已有的商品信息,并提示用户输入需要删除的商品编号,系统自动判断该商品是否已经存在,若存在则提示用户是否删除该商品;若不存在则提示无法找到该商品。 IV修改商品模块:首先自动显示系统中已有的商品信息,并提示用户输入需要修改的商品编号,系统自动判断该商品是否已经存在,若存在则提示用户输入新的商品信息;若不存在则提示无法找到该商品。 V查询商品模块:该模块通过用户输入的商品编号来查找商品,若存在则提示用户是否显示商品所有信息,若不存在则提示无法找到该商品。 VI显示商品模块:该模块负责将所有商品的信息列表显示出来。 (2)用户管理模块:包括5个子模块,分别是新增用户信息模块、删除用户信息模块、修改用户信息模块、查找用户信息模块和显示用户信息模块; I增加用户模块:首先自动显示系统中已有的用户信息,如果还没有用户,显示没有记录。提示管理员是否需要增加,管理员输入需要增加的用户编号,系统自动判断该用户是否已经存在,若存在则无法增加;若不存在,则提示管理员输入要增加用户的相关信息,一条要增加用户的所有信息均输入完成之后,系统还会询问是否继续进行增加其他用户的操作。 II删除用户模块:首先自动显示系统中已有的用户信息,并提示管理员输入需要删除的用户编号,系统自动判断该用户是否已经存在,若存在则提示管理员是否删除该用户;若不存在则提示无法找到该用户。 III修改用户模块:首先自动显示系统中已有的用户信息,并提示管理员输入需要修改的用户编号,系统自动判断该用户是否已经存在,若存在则提示管理员输入新的用户信息;若不存在则提示无法找到该用户。 IV查询用户模块:该模块通过管理员输入的用户编号来查找用户,若存在则提示管理员是否显示用户所有信息,若不存在则提示无法找到该用户。 V显示用户模块:该模块负责将所有用户的信息列表显示出来。 (3)用户购买/退货管理模块:包括2个子模块,分别是用户购买管理模块和用户退货管理模块

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值