【practise】只出现一次的数字

news2024/9/29 23:58:38

现在给你一个数组,里面放了一些数字,里面都是两两成对,只有一个数字是单独的,要求找出其中只出现一次的数字。相必这道题是非常简单了,有很多解法比如说用暴力求解?比如说用位运算?甚至说用哈希数组统计?

相信大家都有很多方法去解决这个简单的问题,在本文中我收录了三道比较简单的关于“只出现一次的数字”话题的三道题目,我均用位运算的方法去解决,有需要借鉴即可。

1.只出现一次的数字1

题目链接:LINK
在这里插入图片描述

class Solution {
public:
    int singleNumber(vector<int>& nums) 
    {
        // 异或思路
        /*
        * 原理:
        * 两个相同的数字相异或为0
        * 0异或上任何数字都为任何数字
        * 异或支持交换律
        */

        int ret = 0;
        for(auto& n: nums)
        {
            ret^=n;
        }

        return ret;
    }
};

上面这道题非常简单,我不再多说。

接下来上一点点难度。

2.只出现一次的数字2

题目链接:LINK
在这里插入图片描述
看到这个题目是不是感觉直接位运算不行了?直接位运算的确不行,但是我们到比特位的视角仍然是可以滴。
这个题目之前是写过博客的,详细情况去直接看我写的那个博客文章吧:链接是LINK

class Solution {
public:
    int singleNumber(vector<int>& nums) {
        int ret = 0;

        // 以比特位为单位,对每个数据进行遍历
        for(int i = 0; i < 32; i++)
        {
            int count = 0;
            // 统计所有数字第i位有多少个1
            for(auto& n: nums)
            {
                if(((n >> i) & 1) == 1)
                {
                    count++;
                }
            }

            // 如果这个1的个数模3刚好剩下一个,那么我们的ret也是要有1的。
            if(count % 3 == 1)
            {
                ret = (ret | (1 << i)); 
            }
        }

        return ret;
    }
};

好,倘若你可以独立完成这道题,当然是第一次做的话,说明你的思维贼好使。我们继续来看下面这道题:

3.只出现一次的数字3

题目链接:LINK
在这里插入图片描述
这个思路就是把所有数字异或起来,最后得到一个数,这个数其实等价于恰好出现一次的那两个数相异或的结果。我们找到这个数有1的地方,说明两个要返回的数字对应位置的比特位是不一样的。然后我们再根据这个不一样的比特位让所有数分成两组,对每组单独异或就可得到两个要求的数字。

在这里插入图片描述
注:上图来源于力扣官方题解。
按照思路,我们可以写出下面代码:

class Solution {
public:
    vector<int> singleNumber(vector<int>& nums) {
        // 找出两个不同数的最右的差异为1
        int t_ret = 0;
        for(auto& n: nums)
        {
            t_ret^=n;
        }
        int l = t_ret & (-t_ret);

        // 根据差异我们将所有数字归为两类,一类是一位有1的,另一类是没1的。
        int ret1 = 0;
        int ret2 = 0;
        for(int& n : nums)
        {
            if(n & l)
            {
                ret1 ^= n;
            }
            else
            {
                ret2 ^= n;
            }
        }

        return {ret1, ret2};
    }
};

然后…
在这里插入图片描述
原因在于:
在这里插入图片描述
在这里插入图片描述
所以我们在分组之气做一个判断就行了:

class Solution {
public:
    vector<int> singleNumber(vector<int>& nums) {
        // 找出两个不同数的最右的差异为1
        int t_ret = 0;
        for(auto& n: nums)
        {
            t_ret^=n;
        }
        
        // 特殊情况:溢出问题,因为INT_MAX所表示的数字比INT_MIN少一个!此时取符号会溢出
        int l = (t_ret == INT_MIN ? t_ret : t_ret & (-t_ret));

        // 根据差异我们将所有数字归为两类,一类是一位有1的,另一类是没1的。
        int ret1 = 0;
        int ret2 = 0;
        for(int& n : nums)
        {
            if(n & l)
            {
                ret1 ^= n;
            }
            else
            {
                ret2 ^= n;
            }
        }

        return {ret1, ret2};
    }
};

4.总结

在上面三道题中我们都用了位运算的思路去做,第一道是比较常规的,第二道是需要理解比特位、位运算才可以想得到,第三道感觉是有点难度的,我就没想到…看的题解~


EOF

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1980037.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

使用Docker+ollama部署大模型

Docker的安装----在 Ubuntu 系统上安装 Docker 一&#xff1a;配置系统的 APT 软件包管理器 首先添加 Docker 的官方 GPG 密钥 # Add Dockers official GPG key: sudo apt-get update sudo apt-get install ca-certificates curl gnupg sudo install -m 0755 -d /etc/apt/ke…

使用 宝塔面板 部署 php网站

【语料库网站】宝塔面板 在线部署全过程 代码仓库&#xff1a;https://github.com/talmudmaster/RedCorpus 网站介绍 语料库提供双语文本检索和分享功能。供英语、翻译相关专业的爱好者&#xff0c;学生和老师学习使用。 该网站是对BiCorpus开源项目的二次开发。 技术栈&am…

DA14695 printf没办法打印浮点数

是因为没有打开浮点数库&#xff0c;添加了这个库也会导致堆内存的增加

基于Kahn算法|动态线程池,支持扩展点并发执行|召回|过滤

背景 在《分布式领域扩展点设计稿》一文中&#xff0c;我们提到针对业务横向扩展点和纵向扩展点的编排能力。 那有这样的一种场景&#xff1a;针对于一次会话&#xff0c;同时会调很多外部服务&#xff0c;同时这些RPC服务会有多种直接或间接的关系&#xff0c;是否有更高效的…

【Spring】Bean详细解析

1.Spring Bean的生命周期 整体上可以简单分为四步&#xff1a;实例化 —> 属性赋值 —> 初始化 —> 销毁。初始化这一步涉及到的步骤比较多&#xff0c;包含 Aware 接口的依赖注入、BeanPostProcessor 在初始化前后的处理以及 InitializingBean 和 init-method 的初始…

【Vue3】组件通信之$refs

【Vue3】组件通信之$refs 背景简介开发环境开发步骤及源码总结 背景 随着年龄的增长&#xff0c;很多曾经烂熟于心的技术原理已被岁月摩擦得愈发模糊起来&#xff0c;技术出身的人总是很难放下一些执念&#xff0c;遂将这些知识整理成文&#xff0c;以纪念曾经努力学习奋斗的日…

操作系统|day4.Linux、Linux内核、Linux负载、Linux文件存储

文章目录 LinuxLinux内核定义功能态 Linux负载定义 Linux文件存储链接分类区别使用场景 拷贝 Linux Linux内核 定义 内核是操作系统的核心&#xff0c;具有很多最基本功能&#xff0c;它负责管理系统的进程、内存、设备驱动程序、文件和网络系统&#xff0c;决定着系统的性能…

【大模型系列】LanguageBind(ICLR2024.01)

Paper&#xff1a;https://arxiv.org/abs/2310.01852Github&#xff1a;https://github.com/PKU-YuanGroup/LanguageBindHuggingface&#xff1a;https://huggingface.co/spaces/LanguageBind/LanguageBindAuthor&#xff1a;Bin Zhu et al. 北大袁粒团队 文章目录 1 LanguageB…

临床试验的五大意义是什么?

临床试验是临床数据科学和现代医学研究中至关重要的环节&#xff0c;它通过严格的科学方法验证新药、新疗法以及医疗器械的安全性和有效性。临床试验不仅推动了医学科学的进步&#xff0c;也为患者提供了新的治疗选择&#xff0c;提升了公共卫生水平&#xff0c;具有重大的意义…

牛客JS题(二十二)数组过滤

注释很详细&#xff0c;直接上代码 涉及知识点&#xff1a; 合理封装范围判断函数 题干&#xff1a; 我的答案 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /></head><body><select name"&q…

【C语言】C语言期末突击/考研--详解一维数组与字符数组

目录 ​一、一维数组 1.数组的定义 2.一维数组在内存中的存储 二、数组访问越界与数组的传递 1.数组的访问越界 2.数组的传递 三、字符数组与scanf读取字符串 1.字符数组的初始化及传递 2.scanf读取字符串 四、gets函数与puts函数&#xff0c;str系列字符串操作函数 …

「iOS」自定义Modal转场——抽屉视图的实现

「iOS」自定义Modal转场——抽屉视图的实现 文章目录 「iOS」自定义Modal转场——抽屉视图的实现前言错误尝试自定义Modal转场实现流程自定义动画类UIPresentationController 成果展示参考文章 前言 在仿写网易云的过程之中&#xff0c;看到学长之前仿写时实现的抽屉视图&…

Java面试题-集合类

目录 1、请简单介绍下 Java 的集合类吧。 Collection Set TreeSet和HashSet List ArrayList 和 LinkedList 数组和链表的区别 Java 的列表有哪些实现类&#xff1f; Vector Queue Map 能说下 HashMap 的实现原理吗&#xff1f; 能说下 HashMap 的扩容机制吗&#x…

达梦数据库的系统视图v$cachepln

达梦数据库的系统视图v$cachepln 达梦数据库的系统视图V$CACHEPLN的主要作用是提供缓存中SQL执行计划的信息&#xff0c;在 ini 参数 USE_PLN_POOL !0 时才统计。通过查询这个视图&#xff0c;用户可以获取到缓存中的执行计划及其相关信息&#xff0c;如SQL语句文本等。这有助…

JavaScript青少年简明教程:DOM和CSS简介

JavaScript青少年简明教程&#xff1a;DOM和CSS简介 DOM简介 DOM&#xff08;Document Object Model&#xff09;将文档表示为一个树形结构&#xff0c;其中每个节点都是一个对象&#xff0c;每个对象都有其自身的属性和方法。 通过对DOM的操作&#xff0c;开发者可以使用编…

Mojo 不安全指针 详解

该UnsafePointer类型创建对内存中某个位置的间接引用。您可以使用UnsafePointer来动态分配和释放内存,或指向由其他代码分配的内存。您可以使用这些指针编写与低级接口交互的代码,与其他编程语言交互,或构建某些类型的数据结构。但顾名思义,它们本质上是不安全的。例如,当…

各地级市能源消费总量、夜间灯光值数据(2000-2022年)

全国各地级市能源消费总量、夜间灯光值数据&#xff08;2000-2022年&#xff09; 数据年限&#xff1a;2000-2022年 数据格式&#xff1a;excel 数据内容&#xff1a;337个地级市能源消费总量、夜间灯光值数据&#xff0c;包括城市、省份、年份、夜间灯光值&#xff08;总和&am…

子比主题允梦美化插件全开源版本

在其他论坛看到的一款不错的子比美化插件&#xff0c;功能也比较全面&#xff0c;因为插件作者上学没有时间维护&#xff0c;现在开源给大家&#xff0c;插件本站未做测试&#xff0c;需要的朋友自行下载测试&#xff0c;如果有授权的话可以到允梦作者网站进行咨询。需要其他美…

Java高级面试题(二)-- JVM

Jvm虚拟机&#xff0c;运行在操作系统之上&#xff0c;编译执行java代码 1, 面试官&#xff1a;手绘一个类加载过程 补充&#xff1a; 这里的执行硬件 java 调用 c 指令 创建线程 &#xff0c;new thread()->start() 底层代码就是 native start0&#xff08;&#xff09;&…

Golang | Leetcode Golang题解之第321题拼接最大数

题目&#xff1a; 题解&#xff1a; func maxSubsequence(a []int, k int) (s []int) {for i, v : range a {for len(s) > 0 && len(s)len(a)-1-i > k && v > s[len(s)-1] {s s[:len(s)-1]}if len(s) < k {s append(s, v)}}return }func lexico…