lintcode 落单的数(位操作)

简介:

v题目1 落单的数

  给出2*n + 1 个的数字,除其中一个数字之外其他每个数字均出现两次,找到这个数字。

  链接:http://www.lintcode.com/zh-cn/problem/single-number/

v样例

  给出 [1,2,2,1,3,4,3],返回 4

v挑战

  一次遍历,常数级的额外空间复杂度

v解决方案

  方法1思路:将所有的数转换成二进制,因为是int类型,共32位。申请常数级(32位)的额外空间,然后每个数对应的位相加,最后对应位上的和模2。最后的结果就是单个数对应的二进制数。

复制代码
class Solution {
public:
    /**
     * @param A: Array of integers.
     * return: The single number.
     */
    int singleNumber(vector<int> &A) {
        // write your code here
        int ans[35];
        memset(ans, 0, sizeof(ans));
        for(int i=0; i<A.size(); ++i){
            for(int k=0; k<32; k++)
                ans[k] = (ans[k]+((A[i]>>k)&1))%2;
        }
         
        int ret = 0;
        int base = 1;
        for(int i=0; i<32; ++i){
            ret += ans[i]*base;
            base *= 2;
        }
        return ret;
    }
};
复制代码

  方法2思路:通过异或,相同的数结果为0,那么最后的结果一定是落单的数字。

复制代码
class Solution {
public:
    /**
     * @param A: Array of integers.
     * return: The single number.
     */
    int singleNumber(vector<int> &A) {
        // write your code here
        int ans = 0;
        for(int i=0; i<A.size(); ++i)
            ans ^= A[i];
        return ans;
    }
};
复制代码

v题目2 落单的数 II

  给出3*n + 1 个的数字,除其中一个数字之外其他每个数字均出现三次,找到这个数字。

  链接:http://www.lintcode.com/zh-cn/problem/single-number-ii/

v样例

  给出 [1,1,2,3,3,3,2,2,4,1] ,返回 4

v挑战

  一次遍历,常数级的额外空间复杂度

v解决方案

  同上一题的方法1一样的思路。

复制代码
class Solution {
public:
    /**
     * @param A : An integer array
     * @return : An integer 
     */
    int singleNumberII(vector<int> &A) {
        // write your code here
       
        int ans[35];
        memset(ans, 0, sizeof(ans));
        for(int i=0; i<A.size(); ++i){
            for(int k=0; k<32; k++)
                ans[k] = (ans[k]+((A[i]>>k)&1))%3;
        }
         
        int ret = 0;
        int base = 1;
        for(int i=0; i<32; ++i){
            ret += ans[i]*base;
            base *= 2;
        }
        return ret;
    }
};
复制代码

 

v题目3:落单的数 III

  给出2*n + 2个的数字,除其中两个数字之外其他每个数字均出现两次,找到这两个数字。

  链接:http://www.lintcode.com/zh-cn/problem/single-number-iii/

v样例

  给出 [1,2,2,3,4,4,5,3],返回 1和5

v挑战

  O(n)时间复杂度,O(1)的额外空间复杂度

v解决方案

      

  如上图所示,所有数的异或的结果等于两个落单数异或的结果(设为S)。如何根据这个异或的结果将落单的数找出来呢?首先,S的值一定不为0,那么找到S对应的二进制数值为1的位(找到任意一个位为1都行, 这里我们找到S的二进制最后一个为1的位,设为P),根据这一个位置,将所有的数划分成两部分,一部分是对应二进制P位是1,另一部分对应二进制P位是0。这样就把两个落单的数划分到了不同的集合里去了。如上图的红色框集合和绿色框集合。然后就转换成“2*m+1个数字,除了一个数字其他数字均出现两次”的问题,也就是题目1:落单的数I

复制代码
class Solution {
public:
    /**
     * @param A : An integer array
     * @return : Two integers
     */
     
    int findNum(int k, vector<int> &A, bool flag){
        int ret = 0;
        for(int i=0; i<A.size(); ++i){
            if(flag && (1<<k)&A[i])
                ret ^= A[i];
            if(!flag && !((1<<k)&A[i]))
                ret ^= A[i];
        }
        return ret;
    }
    vector<int> singleNumberIII(vector<int> &A) {
        // write your code here
        int x = 0;
        for(int i=0; i<A.size(); ++i)
            x ^= A[i];
        int k = 0;
        for(k; k<32; ++k)//找到异或值最后一个1,说明该位置P之后,两个不同的数对应的二进制是相同的
            if((1<<k)&x)
                break;
      //根据这个位置P,转换成“2*m+1个数字,除了一个数字其他数字均出现两次”的问题
      //将位置P上对应为1的数字异或得到一个数字,然后再将位置P上对应为0的数字异或得到一个数字,最后得到答案
        vector<int> ans;
        ans.push_back(findNum(k, A, true));
        ans.push_back(findNum(k, A, false));
        return ans;
    }
};
复制代码
目录
相关文章
|
5天前
|
搜索推荐 编译器 Linux
一个可用于企业开发及通用跨平台的Makefile文件
一款适用于企业级开发的通用跨平台Makefile,支持C/C++混合编译、多目标输出(可执行文件、静态/动态库)、Release/Debug版本管理。配置简洁,仅需修改带`MF_CONFIGURE_`前缀的变量,支持脚本化配置与子Makefile管理,具备完善日志、错误提示和跨平台兼容性,附详细文档与示例,便于学习与集成。
303 116
|
20天前
|
域名解析 人工智能
【实操攻略】手把手教学,免费领取.CN域名
即日起至2025年12月31日,购买万小智AI建站或云·企业官网,每单可免费领1个.CN域名首年!跟我了解领取攻略吧~
|
7天前
|
数据采集 人工智能 自然语言处理
Meta SAM3开源:让图像分割,听懂你的话
Meta发布并开源SAM 3,首个支持文本或视觉提示的统一图像视频分割模型,可精准分割“红色条纹伞”等开放词汇概念,覆盖400万独特概念,性能达人类水平75%–80%,推动视觉分割新突破。
496 45
Meta SAM3开源:让图像分割,听懂你的话
|
14天前
|
安全 Java Android开发
深度解析 Android 崩溃捕获原理及从崩溃到归因的闭环实践
崩溃堆栈全是 a.b.c?Native 错误查不到行号?本文详解 Android 崩溃采集全链路原理,教你如何把“天书”变“说明书”。RUM SDK 已支持一键接入。
694 223
|
2天前
|
Windows
dll错误修复 ,可指定下载dll,regsvr32等
dll错误修复 ,可指定下载dll,regsvr32等
135 95
|
12天前
|
人工智能 移动开发 自然语言处理
2025最新HTML静态网页制作工具推荐:10款免费在线生成器小白也能5分钟上手
晓猛团队精选2025年10款真正免费、无需编程的在线HTML建站工具,涵盖AI生成、拖拽编辑、设计稿转代码等多种类型,均支持浏览器直接使用、快速出图与文件导出,特别适合零基础用户快速搭建个人网站、落地页或企业官网。
1710 158
|
存储 人工智能 监控
从代码生成到自主决策:打造一个Coding驱动的“自我编程”Agent
本文介绍了一种基于LLM的“自我编程”Agent系统,通过代码驱动实现复杂逻辑。该Agent以Python为执行引擎,结合Py4j实现Java与Python交互,支持多工具调用、记忆分层与上下文工程,具备感知、认知、表达、自我评估等能力模块,目标是打造可进化的“1.5线”智能助手。
953 62