在数组中找出只出现一次的两个数

在线体验各类最新模型,更有模型 免费Token 额度领取!
立即体验
简介:

j_0020.gif来来来,看一道面试题!!!


题目是这样叙述的:

         在一个数组中除两个数字只出现1次外,其它数字都出现了2次, 要求尽快找出这两个数字。

         要求:时间复杂度为O(N),空间复杂度为O(1)。

j_0012.gif这该怎么解决呢???

          请看我的分析:


将这道题简单化:

    一个数组中只有一个数字出现一次,其他数字都是成对出现的,这时我们可以根据异或运算符的特性:A^B^A = B; 0 ^ A = A;我们可以将这个数组的全部元素依次做异或运算,最终结果就是那个只出现一次的数字。


    如果这个数组中出现两个不同的数字,而其他数字均出现两次,假设这两个数字分别是x, y。那如果可以将x, y分离到两个数组。这时这道题就变成两个我们简化之后的版本中的数组了。这样问题就可以得到解决了。由于x,y肯定是不相等的,因此在二进制上必定至少有一位是不同的。根据这一位是0还是1可以将x,y分开到A组和B组。并且数组中其他元素也可以根据这个方法划分到两个数组中。这时将两个数组分别做异或运算,结果就是这两个数字。


y_0034.gif下面就看我实现的例子吧:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
void  FindNums( int  a[],  int  n,  int * num1,  int * num2) //a[]一维数组;n是数组中的元素个数;
{                                          //num1和num2分别要保存两个只出现一次的数字
     int  tmp = 0;
     for  ( int  i = 0; i < n; i++)
     {
         tmp ^= a[i];
     }
     int  j = 0;
     for  (j; j <  sizeof ( int )* 8; j++)
     {
         if  ((tmp >> j) & 1 == 1)
             break ;
     }
     
     num1 = 0;
     num2 = 0;
     for  ( int  i = 0; i < n; i++)
     {
         if  ((a[i] >> j) & 1 == 1)
         {
             *num1 ^= a[i];
         }
         else
         {
             *num2 ^= a[i];
         }
     }
}


t_0016.gif恩,问题解决了


本文转自 七十七快 51CTO博客,原文链接:http://blog.51cto.com/10324228/1787589


相关文章
Android10.0 最近任务Recents功能分析(上)
Android10.0 最近任务Recents功能分析(上)
2202 2
Android10.0 最近任务Recents功能分析(上)
|
JSON 关系型数据库 Go
gorm 教程三 gen代码生成框架
gorm 教程三 gen代码生成框架
554 0
|
存储 安全 网络协议
阿里云SSL数字证书原理、使用、申请流程及部署方式
本文带您了解阿里云数字证书的基本原理、使用、申请流程及部署方式
|
5月前
|
人工智能 物联网 Shell
告别“人工智障”:零代码驯服大语言模型,打造你的专属AI助手
本文详解大模型微调(Fine-tuning)如何破解通用AI“懂但不专”的痛点:用专属数据为大模型做“岗前培训”。全程零代码、纯在线,基于ModelScope与QLoRA技术,30分钟即可完成Yi-6B模型微调,重塑其身份认知。兼顾原理通俗解读与手把手实战,助你真正掌握“塑造AI”的主动权。(239字)
488 3
告别“人工智障”:零代码驯服大语言模型,打造你的专属AI助手
|
4月前
|
自然语言处理 安全 JavaScript
OpenClaw有什么Skill?OpenClaw部署流程+免费大模型API(百炼+Ollama+Qwen2.5)及 find-skills 功能详解
而find-skills技能的出现,彻底解决了这一痛点。作为OpenClaw生态中最受欢迎的技能发现工具,它累计部署量达87.6k,收获398个GitHub星标,支持通过自然语言或关键词快速搜索、安装、更新技能,让技能管理像“逛应用商店”一样简单。本文基于官方文档与实测经验,先拆解find-skills的核心功能与安全注意事项,再完整呈现2026年OpenClaw零基础阿里云部署流程、阿里云百炼API与免费大模型API(Ollama+Qwen2.5)双配置方案,详解find-skills实战场景与避坑要点,所有代码命令可直接复制执行,无营销词汇,助力新手高效解锁OpenClaw的全场景能力。
2785 7
|
机器学习/深度学习 存储 设计模式
Python 高级编程与实战:深入理解性能优化与调试技巧
本文深入探讨了Python的性能优化与调试技巧,涵盖profiling、caching、Cython等优化工具,以及pdb、logging、assert等调试方法。通过实战项目,如优化斐波那契数列计算和调试Web应用,帮助读者掌握这些技术,提升编程效率。附有进一步学习资源,助力读者深入学习。
|
前端开发 开发者 UED
《从线性到二维:CSS Grid与Flex的布局范式革命与差异解析》
CSS Grid布局与Flex布局是现代前端开发中不可或缺的两大布局技术。CSS Grid作为二维网格系统,擅长复杂页面结构和响应式设计,通过网格容器、轨道与单元格实现精确的空间划分与元素定位。Flex布局则专注于一维排列,适用于导航栏、列表等内容驱动场景,提供灵活的对齐与空间分配能力。两者各有优势,可独立或结合使用,满足不同布局需求。掌握它们的核心概念与应用技巧,能显著提升开发效率,打造精美高效的网页布局。
341 18
|
存储 JSON JavaScript
Node.js Buffer(缓冲区)
Node.js Buffer(缓冲区)
241 1
|
物联网 API 开发工具
Stm32 固件库介绍及获取方法 | 学习笔记
快速学习 Stm32 固件库介绍及获取方法
1017 10
Stm32 固件库介绍及获取方法 | 学习笔记