当前位置: 首页 > news >正文

求数组中只出现一次的数字(算法)

  首先,我们先考虑简单的情况下,就是只有一个出现一次的数字,其余数字都出现2次,这样我们可以采用一种很巧妙的方法:“异或”。

void findNumAppearOnce(int date[],int length,int &num)
{
       if(length<2)
              return;
        num=0;
        for(int i=0;i<length;i++)
       {
              num ^=date[i];
       }
}

 然后,我们考虑有两个出现一次的数字的情况。同理,我们依然采用上面的方法,由于两个出现一次的数字肯定不相同,最后的结果就是这两个数字的异或结果,因而这个结果必不为0,至少存在一位为1(就是由于这两个出现一次的数字的同一位上:一个为0,一个为1)。因此,我们首先找到一位不为0的二进制位n,把所有的数据按照此位划分为两组,这两组的第n位分别为0和1,这样就能保证每组中必然包含一个仅出现一次的数字。

  源代码参考:剑指Offer

  代码如下:

#include <iostream>
using namespace std;
//从左向右移动,获取第一个为1的位数
unsigned int FindFirstBitIs1(int num)
{
    int indexBit = 0;
    while(((num&1)==0)&&(indexBit<32))
    {
        num=num>>1;
        ++indexBit;
    }
    return indexBit;
}
//对数据分组
bool IsBit1(int num,unsigned int indexBit)
{
    //移动相应的位数,让相对位置移动到最后一位上
    num=num>>indexBit;
    //例如:1001101 ^ 0000001 这样的情况为0 ; 1010110 ^ 0000001 这样的情况为1
    return (num & 1);
}

void findNumAppearOnce(int date[],int length,int &num1, int &num2)
{    
    if (length<2)
        return;

    //get num1^num2
    int resultExclusiveOR = 0;
    for (int i=0;i<length;i++)
        resultExclusiveOR ^=date[i];
    
    unsigned int indexOf1 = FindFirstBitIs1(resultExclusiveOR);

    num1=0;num2=0;
    for (int j=0;j<length;j++)
    {
        if(IsBit1(date[j],indexOf1))
            num1 ^=date[j];
        else
            num2 ^=date[j];
    }
    
}

int main(int argc,char* argv[])
{
    int a[6];
    for(int i=0;i<6;i++)
        cin>>a[i];
    
    int num1,num2;
    findNumAppearOnce(a,6,num1,num2);
    cout<<"num1="<<num1<<endl;
    cout<<"num2="<<num2<<endl;
    return 0;
}

 

 

相关文章:

  • 黄聪:公众号怎么用微信做出点击此处查看答案
  • 远程调用
  • Kinect+OpenNI学习笔记之12(简单手势所表示的数字的识别)
  • 超强大的响应式图表工具 (Echarts)
  • 4-8Expect实现批量主机公钥推送
  • 纯PHP Codeigniter(CI) ThinkPHP效率测试
  • Spring Cloud-Honghu Cloud分布式微服务云系统—技术点
  • 在Winform,Silvelight,WPF等程序中访问Asp.net MVC web api
  • python中的json和pickle
  • 接口库设计总结
  • 庆祝一下开通了第一条博客!
  • 微软私有云
  • fileUpload(草稿)
  • .NET多线程执行函数
  • jdk1.5新特性2之动态参数列表
  • Flex布局到底解决了什么问题
  • HTTP那些事
  • js写一个简单的选项卡
  • KMP算法及优化
  • MySQL数据库运维之数据恢复
  • Python - 闭包Closure
  • quasar-framework cnodejs社区
  • React-生命周期杂记
  • React组件设计模式(一)
  • sessionStorage和localStorage
  • 产品三维模型在线预览
  • 基于Vue2全家桶的移动端AppDEMO实现
  • 提醒我喝水chrome插件开发指南
  • 怎么把视频里的音乐提取出来
  • ​比特币大跌的 2 个原因
  • #if 1...#endif
  • #QT(一种朴素的计算器实现方法)
  • #单片机(TB6600驱动42步进电机)
  • (附源码)springboot 智能停车场系统 毕业设计065415
  • (附源码)计算机毕业设计SSM教师教学质量评价系统
  • (入门自用)--C++--抽象类--多态原理--虚表--1020
  • (转)memcache、redis缓存
  • .htaccess配置常用技巧
  • .libPaths()设置包加载目录
  • .NET CF命令行调试器MDbg入门(二) 设备模拟器
  • .Net Core缓存组件(MemoryCache)源码解析
  • .net 重复调用webservice_Java RMI 远程调用详解,优劣势说明
  • .net经典笔试题
  • .NET学习全景图
  • /var/lib/dpkg/lock 锁定问题
  • @ResponseBody
  • [ 隧道技术 ] cpolar 工具详解之将内网端口映射到公网
  • [ 网络基础篇 ] MAP 迈普交换机常用命令详解
  • [2021]Zookeeper getAcl命令未授权访问漏洞概述与解决
  • [IE6 only]关于Flash/Flex,返回数据产生流错误Error #2032的解决方式
  • [IE编程] WebBrowser控件中设置页面的缩放
  • [Kubernetes]8. K8s使用Helm部署mysql集群(主从数据库集群)
  • [LeetCode]Max Points on a Line
  • [LeetCode]-使用特殊算法的题目-2
  • [Linux] Ubuntu install Miniconda