【每日一题】只出现一次的数字 III

news2024/11/26 21:30:52

文章目录

  • Tag
  • 题目来源
  • 题目解读
  • 解题思路
    • 方法一:位运算
  • 其他语言
    • c
    • python3
  • 写在最后

Tag

【位运算】【数组】【2023-10-16】


题目来源

260. 只出现一次的数字 III


题目解读

找出数组中恰好只出现一次的连个元素,其余的所有元素均出现两次。要求算法的时间复杂度为线性的,空间复杂度为常量级别的。


解题思路

方法一:位运算

我们先对数组 nums 中的虽有元素进行一次异或操作,得到的值 x 是数组中仅仅出现过一次的两个数的异或值,即 x = x 1 ⨁ x 2 x = x_1 \bigoplus x_2 x=x1x2 x 1 x_1 x1 x 2 x_2 x2 分别表示数组中仅仅出现过一次的两个数。

显然,这个 x x x 的值不会等于 0,因为一旦等于 0,那么说明 x 1 = x 2 x_1 = x_2 x1=x2,这样 x 1 x_1 x1 x 2 x_2 x2 就不是仅出现一次的数了。

现在使用位运算 KaTeX parse error: Expected 'EOF', got '&' at position 3: x &̲ -x 可以得到 x x x 的二进制表示位中最低位的 1,设其为第 i,也就表示 x 1 x_1 x1 x 2 x_2 x2 中的某一个数的二进制表示的第 i 位为 0,另一个数的第 i 位为 1,我们可以据此来将数组中的所有元素分类:

  • i 位为 1 的为一类;
  • i 位为 0 的为一类;

根据以上分类,我们知道 x 1 x_1 x1 x 2 x_2 x2 分属在以上两个类中。每个类中出现的数有一个数是仅出现一次的数,其他的数都是出现两次的。于是,我们对每一个类中的元素进行异或和操作,就得到了该类中仅出现一次的元素。对这两个类分别进行异或和操作就得到了数组 nums 中仅出现了一次的两个数。

实现代码

class Solution {
public:
    vector<int> singleNumber(vector<int>& nums) {
        int sum = 0;
        for(auto &num : nums){
            sum ^= num;
        }
        
        // 防止溢出
        int lst = ((sum == INT_MIN) ? sum : sum & (-sum));
        
        int num1 = 0, num2 = 0;
        for(auto &num : nums){
            if(lst & num){
                num1 ^= num;
            }
            else{
                num2 ^= num;
            }
        }
        return {num1, num2};
    }
};

复杂度分析

时间复杂度: n n n 是数组 nums 的长度。

空间复杂度: O ( 1 ) O(1) O(1)


其他语言

c

/**
 * Note: The returned array must be malloced, assume caller calls free().
 */
int* singleNumber(int* nums, int numsSize, int* returnSize){
    int xorsum = 0;
    for (int i = 0; i < numsSize; ++i) {
        xorsum ^= nums[i];
    }

    int lsb = (xorsum == INT_MIN ? xorsum : xorsum & (-xorsum));
    int x1 = 0, x2 = 0;
    for (int i = 0; i < numsSize; ++i) {
        int num = nums[i];
        if (num & lsb) {
            x1 ^= num;
        }
        else {
            x2 ^= num;
        }
    }

    int *res = (int *)malloc(sizeof(int) * 2);
    res[0] = x1;
    res[1] = x2;
    *returnSize = 2;
    return res;
}

python3

class Solution:
    def singleNumber(self, nums: List[int]) -> List[int]:
        xorsum = 0
        for num in nums:
            xorsum ^= num
        
        lsb = xorsum & (-xorsum)
        x1, x2 = 0, 0
        for num in nums:
            if num & lsb:
                x1 ^= num
            else:
                x2 ^= num
        return [x1, x2]

写在最后

如果文章内容有任何错误或者您对文章有任何疑问,欢迎私信博主或者在评论区指出 💬💬💬。

如果大家有更优的时间、空间复杂度方法,欢迎评论区交流。

最后,感谢您的阅读,如果感到有所收获的话可以给博主点一个 👍 哦。

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

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

相关文章

获取Steam余额的几种方式,及Steam余额被红锁的几种情况

今天就跟大家聊聊买余额的话题&#xff0c;获取Steam余额的几种方式&#xff0c;及Steam余额被红锁的几种情况。 什么是买余额呢&#xff1f; 指的就是卖家通过steam市场里面的饰品出售功能&#xff0c;把steam账号里的余额转移到买家账号中。 大家都知道&#xff0c;自从充值…

【前段基础入门之】=>CSS3新特性 2D 变换

导语&#xff1a; CSS3新特性&#xff0c;给我们带来了很多的丰富的过渡变换效果&#xff0c;这些效果使我们的页面效果变得更加的生动&#xff0c;这一章节&#xff0c;就给大家带来CSS3中的第一个变换效果&#xff1a;2D 变换 在正式了解2D 变换之前,我们需要了解&#xff0c…

啥?PS一秒成图?Adobe的逆天黑科技大公开

在日前举行的 Adobe MAX 创意大会上&#xff0c;Adobe Adobe Firefly Image 2&#xff08;萤火虫二代成像模型&#xff09;、Firefly Vector Model&#xff08;萤火虫矢量模型&#xff09;和Firefly Design Model&#xff08;萤火虫设计模型&#xff09;。 Firefly矢量模型是世…

155M传输分析仪 优劣势分析

D240S SDH测试模块&#xff0c;是FT100智能网络测试平台产品家族的一部分&#xff0c;是一个坚固耐用、锂电池超长供电的传统PDH/SDH测试解决方案&#xff0c;支持155Mbps到2.048Mbps速率的传输链路测试。支持在线和离线的传输链路的安装、维护和故障排除应用测试。 同时为经验…

分享一下微信小程序怎么添加抽奖活动

微信小程序是一种无需下载安装即可使用的应用&#xff0c;近年来在各行各业中得到了广泛应用。对于企业或商家而言&#xff0c;利用微信小程序开展抽奖活动可以吸引更多的用户关注&#xff0c;增加用户粘性并促进品牌传播。下面就以微信小程序添加抽奖活动为主题&#xff0c;探…

【Linux】环境下部署Nginx服务 - 二进制部署方式

&#x1f468;‍&#x1f393;博主简介 &#x1f3c5;云计算领域优质创作者   &#x1f3c5;华为云开发者社区专家博主   &#x1f3c5;阿里云开发者社区专家博主 &#x1f48a;交流社区&#xff1a;运维交流社区 欢迎大家的加入&#xff01; &#x1f40b; 希望大家多多支…

SOLIDWORKS PDM—2024版本新增

SOLIDWORKS产品数据管理 (PDM) 解决方案可帮助您控制设计数据&#xff0c;并且从本质上改进您的团队就产品开发进行管理和协作的方式。使用 SOLIDWORKS PDM Professional&#xff0c;您的团队能够&#xff1a;1. 安全地存储和索引设计数据以实现快速检索&#xff1b;2. 打消关于…

从简单到复杂,MVI 架构定义与封装使用总结

前言 时间回到一年多前讨论度很高的 MVI 架构&#xff0c;现在也已尘埃落地&#xff0c;没有什么争议并各自都有自己的一套实现方案了&#xff0c;接下来我们就看看这些网上各种各样的 MVI 架构是如何从简单到复杂&#xff0c;从 Java 到 Kotlin 到协程再到 Compose 的各个场景…

gitee page中HTML显示乱码

参考的&#xff1a;静态HTML网页部署到gitee后中文乱码-CSDN博客 根据上述引用的博客做完后要记得在gitee page中更新(我就是没点更新以为用不了)

广告牌安全传感器怎么用?为城市能起到什么效果?

随着城市的迅速发展和经济的快速增长&#xff0c;广告牌在城市中扮演着越来越重要的角色。但是近年来广告牌缺乏修缮和维护&#xff0c;广告牌所带来的安全隐患逐年增加。 广告牌作为城市的明信片&#xff0c;出现损坏&#xff0c;且具有一定的安全隐患之后&#xff0c;给城市带…

你不一定全部知道的16种进程注入方法和注入工具(C语言版)

一、前言 提起进程注入&#xff0c;似乎感觉挺奇妙的&#xff0c;毕竟这是黑客的入门必备技术之一&#xff0c;互联网发展这么多年&#xff0c;每年都会有新的技术出现&#xff0c;自然也就有了很多的进程注入的方法。今天小编要和大家讲的是16种我们比较常见的进程注入方法&a…

进化策略算法

前言 进化策略 (Evolution Strategy) 后面都简称 ES&#xff0c;其本质就是&#xff1a;种群通过交叉产生后代&#xff0c;我们只保留较好的父代和子代&#xff0c;一直这样迭代下去&#xff0c; 我们的保留方式是&#xff1a; 父代产生后代&#xff0c;然后将后代DNA和原来的…

C++入门-引用

C入门-引用 前置知识点:函数栈帧的复用前置知识点:类型转换时产生的临时变量1.含义2.代码形式3.引用的价值1.传参数传参效率测试补充:C与Java中引用的区别 2.引用做返回值(前置知识:栈帧复用)1.传值返回2.传引用返回传引用返回并用引用接收3.静态变量传引用返回4.引用做返回值真…

Redis数据结构的奇妙世界:一窥底层存储机制【redis第一部分】

Redis数据结构的奇妙世界&#xff1a;一窥底层存储机制【redis第一部分】 前言第一&#xff1a;为什么要使用redis第二&#xff1a;redis的底层数据结构第三&#xff1a;Redis的基本数据类型1. 字符串&#xff08;String&#xff09;2. 列表&#xff08;List&#xff09;3. 集合…

Ansible的playbook编写和运行示例介绍

目录 一.yaml语法格式 1.定义&#xff1a; 2.yaml支持几种数据类型 &#xff08;1&#xff09;纯量&#xff1a; &#xff08;2&#xff09;对象 &#xff08;3&#xff09;数组 3.playbook-yaml书写的注意事项 二.playbook编写和运行 1.单个简单playbook示例 &#…

2023_Spark_实验二十:SparkStreaming累加计算单词频率

一、需求分析 在服务器端不断产生数据的时候&#xff0c;sparkstreaming客户端需要不断统计服务器端产生的相同数据出现的总数&#xff0c;即累计服务器端产生的相同数据的出现的次数。 二、实验环境 centos7 nc spark2.1.1 windows idea 三、思路分析 流程分析 思路分析…

BUUCTF学习(7): 随便注,固网杯

1、介绍 2、解题 11;show tables;# select * from 1919810931114514 concat(sel,ect from 1919810931114514 ) PEREPARE y from sql; ECCUTE y; -1; sEt sql CONCAt(se,lect * from 1919810931114514;)&#xff1b; prePare stmt from sql; EXECUTE stmt; # 结束

代码随想录算法训练营第二十三天丨 回溯算法part01

回溯算法理论基础 #题目分类 #理论 #什么是回溯法 回溯法也可以叫做回溯搜索法&#xff0c;它是一种搜索的方式。 在二叉树系列中&#xff0c;不止一次提到了回溯&#xff0c;例如二叉树&#xff1a;以为使用了递归&#xff0c;其实还隐藏着回溯 (opens new window)。 回溯…

5款令人骄傲的国产优质软件,能让你的电脑办公更加高效

很多人都喜欢用国外软件&#xff0c;其实国内也有不少优秀软件。这些国产软件不输国外软件&#xff0c;能够提高我们的办公效率&#xff0c;帮助我们更好地处理日常事务。今天就给大家分享5款令人骄傲的国产优质软件&#xff0c;它们能让你的电脑办公更加高效。 Listary——文件…

机器学习 - 混淆矩阵:技术与实战全方位解析

目录 一、引言1.1 什么是混淆矩阵&#xff1f;1.2 为什么需要混淆矩阵&#xff1f; 二、基础概念TP, TN, FP, FN解释True Positive (TP)True Negative (TN)False Positive (FP)False Negative (FN) 常见评价指标 三、数学原理条件概率与贝叶斯定理ROC与AUC敏感性与特异性阈值选…