我的编程空间,编程开发者的网络收藏夹
学习永远不晚

如何利用C语言位运算解决只出现一次的数字

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

如何利用C语言位运算解决只出现一次的数字

解题所需要的C语言基础知识

hello!从现在开始就进入本题解的正式内容了。首先给大家用图解的方式介绍3个C语言位运算的基本操作符 & | ^

这些知识对下面的解题都非常重要,一定要熟练掌握,不然等会会有一种“我在哪,我是谁我在干什么”的感觉。

只出现一次的数字I

题目描述

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

说明:

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

示例 1:

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

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

力扣本题链接

解题思路

首先,根据题意,“有不可以额外使用空间这个限定”,看到这里以后要本能的往位运算上面去靠,因为位运算可以不开辟额外空间解决很多问题,然后回看一下刚刚回顾的位运算知识,就知道我们要用到 ^这个操作符了,因为它可以非常简单的消除重复项,剩下只出现一次的数字。

说了这么多,接下来让我们来看看代码的实现


int singleNumber(int* nums, int numsSize){
int ret=0;//0异或任何数都不会印象他的实际值
for(int i=0;i<numsSize;i++)
{
 ret^=nums[i];//所有数异或,重复的消掉,剩下只出现一次的数字
}
return ret;//返回这个数字
}

这只是一个开胃菜,下面正式进入主菜

只出现一次的数字II

题目描述

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

说明:

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

示例 1:

输入: [2,2,3,2] 输出: 3
``示例 2:

输入: [0,1,0,1,0,1,99] 输出: 99

力扣本题链接

解题思路

如图所示,考虑数字的二进制位形式,出现三次的数字,二进制位各位上的1都是三的倍数,所以求出各位上的1数目,再对3求余,则可求出只出现一次的数字

那么要怎样求取二进制位各位上1的数目呐,那就要用到&这个操作符了,来看代码实现吧


int singleNumber(int* nums, int numsSize){
 
 int ret=0;
for(int i=0;i<32;++i)//循环遍历二进制位每一位
{
long cnt=0;//不用long,力扣的编译器不通过,不让int类型左移31位,我也不知道
 for(int j=0;j<numsSize;++j) {//将nums数组中每一个数拿出来,二进制位向右移动i位,与1按位与,
 cnt+=(nums[j]>>i)&1;//则可求出二进制位第i位是否为1;
 }
 ret+=(cnt%3)<<i;//将cnt的值模3,求出只出现一次的那个数第i位为1还是为0,再向左移动i位还原,最后相加求出这个数
}
return ret;
}

好了,这个题目就圆满解决了。

只出现一次的数字III

这个题目就很有技巧了 题目描述
260. 只出现一次的数字 III 给定一个整数数组 nums,其中恰好有两个元素只出现一次,其余所有元素均出现两次。 找出只出现一次的那两个元素。你可以按 任意顺序 返回答案。

进阶:你的算法应该具有线性时间复杂度。你能否仅使用常数空间复杂度来实现?

示例 1:

输入:nums = [1,2,1,3,2,5] 输出:[3,5] 解释:[5, 3] 也是有效的答案。
示例 2:

输入:nums = [-1,0] 输出:[-1,0]
示例 3:

输入:nums = [0,1] 输出:[1,0]

力扣本题链接

解题思路

根据第一题的思路,就知道要全部按位异或,消除重复项。但是两个只出现一次的数也异或在了一起,我们的难点就是怎么将这两个数分离。接下来就用图示法来告诉大家怎样分离两个数

接下来是代码的实现



int* singleNumber(int* nums, int numsSize, int* returnSize){
int m = 0;
int ret = 0;
for (int i = 0; i < numsSize; i++)
{
	ret ^= nums[i];//将全部数异或
}
while (m < 32)
{
	if ((ret>>m)&1)//找出为1的第m位
		break;
	else
  ++m;
}
int x1 = 0, x2 = 0;//分组
int j=0;
while(j<numsSize)
{
	if ((nums[j]>>m)&1)
		x1 ^= nums[j];//异或出只出现一次的数字
	else
		x2 ^= nums[j];
  j++;
}
int* reRer = (int*)malloc(sizeof(int) * 2);
reRer[0] = x1;
reRer[1] = x2;
*returnSize=2;//根据题意返回长度
return reRer;//返回这两个数
}

小编总结

这是我第一次写题解,选了三个相对简单常见的题目,不难,但是也能反应出一种做题的思想。我希望大家不是简单的学会这3个题目,而是学会这种思想去解决更多的题目。同时大家有好的解题方案,也可以在评论区中留言哦,大家互相学习,一起进步。

到此这篇关于如何利用C语言位运算解决只出现一次数字的文章就介绍到这了,更多相关C语言位运算解决出现数字内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

如何利用C语言位运算解决只出现一次的数字

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

如何用C#找出数组中只出现了一次的数字

数组从字面上理解就是存放一组数,下面这篇文章主要给大家介绍了关于如何用C#找出数组中只出现了一次的数字,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
2022-12-08

C语言如何计算子串在字符串中出现的次数

C语言计算字符串中子串出现次数有三种方法:使用strstr()函数,遍历字符串寻找子串,效率较低。结合strstr()和strncmp()函数,提高了效率。采用Boyer-Moore算法,适用于大量字符串处理,效率最高。选择合适的方法取决于字符串长度和出现次数,短字符串和少量出现时,方法1或2即可,大字符串和大批量出现时,Boyer-Moore算法更优。
C语言如何计算子串在字符串中出现的次数
2024-04-02

C语言如何利用ASCII码表统计字符串每个字符出现的次数

这篇文章主要介绍了C语言如何利用ASCII码表统计字符串每个字符出现的次数,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
2023-01-28

C语言如何返回字符串在另一个字符串中第一次出现的位置

C语言中,strstr()函数可用于查找字符串在另一个字符串中的首次出现位置。它以指向匹配字符的指针为返回值,匹配失败时返回NULL。算法采用KMP算法构建前缀后缀表,快速比较模式与文本字符串。时间复杂度为O(m+n),其中m为模式长度,n为文本长度。使用时需注意大小写敏感性、不匹配时的后缀跳跃,以及空模式字符串时的特殊情况。
C语言如何返回字符串在另一个字符串中第一次出现的位置
2024-04-02

C语言如何查找字符串在另一个字符串中第一次出现的位置

在C语言中,可以通过strstr()、strchr()或自定义函数使用指针来查找字符串在另一个字符串中的第一次出现位置。strstr()用于查找子串,strchr()用于查找字符,而自定义函数提供更灵活的控制。另外,strcmp()、strncmp()和strstrn()函数也可用于某些特定需求。选择方法取决于字符串长度、性能和应用要求。
C语言如何查找字符串在另一个字符串中第一次出现的位置
2024-04-02

C语言如何查找字符串在另一个字符串中最后一次出现的位置

利用C语言的strstr函数,可以查找字符串在目标字符串中的最后一次出现位置。该函数返回第一次出现位置的指针,如果不存在则返回NULL。本教程还介绍了strrchr、strcspn等相关函数,帮助进行字符串处理。
C语言如何查找字符串在另一个字符串中最后一次出现的位置
2024-04-02

C语言如何查找字符串在另一个字符串中最后一次出现的位置,并返回从该位置到字符串结尾的所有字符

详解如何使用C语言strstr函数查找字符串中最后一次出现的子串,并返回子串后续内容。方法是遍历主串,找到子串后计算其长度,然后返回子串在主串中的位置加上长度后的内容。
C语言如何查找字符串在另一个字符串中最后一次出现的位置,并返回从该位置到字符串结尾的所有字符
2024-04-02

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录