【举一反三】只出现一次的数字

这篇具有很好参考价值的文章主要介绍了【举一反三】只出现一次的数字。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

 本文,讲位运算——异或运算。因为题干中说明要线性时间复杂度,所以采用位运算进行操作,而没有采用哈希表。


目录

1.只出现一次的数字 I

 2.只出现一次的数字 II

 3.只出现一次的数字 III


1.只出现一次的数字 I

136. 只出现一次的数字 - 力扣(LeetCode)

题目:

给你一个 非空整数数组 nums ,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。

你必须设计并实现线性时间复杂度的算法来解决此问题,且该算法只使用常量额外空间

示例 1 :

输入:nums = [2,2,1]

输出:1

从一个成对数组中找到落单的元素。很显然我们可以使用异或运算。(相同为0,不同为1)

  • 两个相同数字做异或运算,结果为0。可以帮我们排除掉成对的数字。
  • 0和任何数字进行异或运算,都得到这个数字本身。

代码:

class Solution {
public:
    int singleNumber(vector<int>& nums) {
        int value=0;
        for(auto e:nums)
        {
            value^=e;
        }
        return value;
    }
};

 2.只出现一次的数字 II

137. 只出现一次的数字 II - 力扣(LeetCode) 

题目:

给你一个整数数组 nums ,除某个元素仅出现 一次 外,其余每个元素都恰出现 三次 。请你找出并返回那个只出现了一次的元素。

你必须设计并实现线性时间复杂度的算法且不使用额外空间来解决此问题。

示例 1:

输入:nums = [2,2,3,2]

输出:

        本题,如果我们继续简单的使用异或,我们会发现最后结果是2^3,没办法得到正确答案。我们可以换个思路题中强调每个元素恰好出现三次,我们从次数的角度出发,考虑该位值为1的次数取模。

        数的每一位只有0或1。首先我们考虑第一位,再依次类推直到第32位结束,答案元素的每一位为0或者为1我们都是已知,即得到该答案元素。

如果非答案元素第一位为0,则有:

  • 答案元素第一位为0,总共0个1,0%3=0
  • 答案元素第一位为1,总共1个1,1%3=1

如果非答案元素第一位为1,则有:

  • 答案元素第一位为0,总共3个1,3%3=0
  • 答案元素第一位为1,总共4个1,4%3=1

例子: 

【举一反三】只出现一次的数字

代码: 

class Solution {
public:
    int singleNumber(vector<int>& nums) {
        int res=0;
        for(int i=0;i<32;i++)
        {
            int sum=0;    //统计值为1的次数
            for(auto& e:nums)
            {
                sum+=((e>>i)&1);
            }
            if((sum%3)==1)
            {
                res|=(1<<i);    //与0移位或运算
            }
        }
        return res;
    }
};

时间复杂度:O(n logC),其中n是数组长度,C是数据范围,本题int数据类型,logC=32。

空间复杂度:O(1)

 3.只出现一次的数字 III

260. 只出现一次的数字 III - 力扣(LeetCode)

题目:

给你一个整数数组 nums,其中恰好有两个元素只出现一次,其余所有元素均出现两次。 找出只出现一次的那两个元素。你可以按 任意顺序 返回答案。

你必须设计并实现线性时间复杂度的算法且仅使用常量额外空间来解决此问题。

示例 1: 

输入:nums = [1,2,1,3,2,5]

输出:[3,5]

解释:[5, 3] 也是有效的答案。

        本题,还是在异或运算的基础上进行拓展,我们观察题目可以发现,这道题目对所有元素异或后的结果也是2个不同的元素进行异或,而其他元素频数都是2如题目I一样消除了。

        也就是说我们可以直接从异或的结果得到启发,某位值为1,就表明两个答案在该位的值不同。我们可以从这个角度为出发点进行切入,对数组分组!两个答案一定在不同的组中。

思路:

已知x^x==0。定义数组的异或和为该数组所有元素的异或。

  • 求出nums的异或和xor,可知xor为两个目标元素的异或。
  • 找到xor中为1的二进制位,假设是第k位。这说明两个目标元素在第k位上不相同。
  • 根据第k位是0还是1,把nums分为两组,这样两个目标元素一定位于不同的组。
  • 分别求出两组的异或和,即得到两个目标元素。

例子: 

【举一反三】只出现一次的数字 代码:

class Solution {
public:
    vector<int> singleNumber(vector<int>& nums) {
        vector<int>ans(2);
        int value=0;
        for(auto& e:nums)
        {
            value^=e;
        }
        int k=0;
        while((value&1)==0)
        {
            value>>=1;
            ++k;
        }
        int ans1=0,ans2=0;
        for(auto&e:nums)
        {
            if(((e>>k)&1)==0)
            {
                ans1^=e;
            }
            else
            {
                ans2^=e;
            }
        }
        ans[0]=ans1;
        ans[1]=ans2;
        return ans;
    }
};

【举一反三】只出现一次的数字

 文章来源地址https://www.toymoban.com/news/detail-413616.html

到了这里,关于【举一反三】只出现一次的数字的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 人工智能时代的十大核心技术:重塑未来的无限可能 - 第三章 - 迁移学习,让AI更聪明地“举一反三”

    迁移学习:让AI更聪明地“举一反三” 在人工智能(AI)的世界里,迁移学习正成为一种强大的工具,它让机器能够像人类一样“举一反三”,将在一个领域学到的知识应用到另一个领域。这种技术的出现,不仅极大地简化了AI系统的训练过程,还显著提高了其学习新任务的速

    2024年01月24日
    浏览(62)
  • 只出现一次的数字

    问题: 给你一个  非空  整数数组  nums  ,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。 你必须设计并实现线性时间复杂度的算法来解决此问题,且该算法只使用常量额外空间。 示例: 示例 1 : 示例 2 : 示例 3 : 思想: 由于

    2024年02月07日
    浏览(40)
  • 只出现一次的数字——力扣136

    2024年02月11日
    浏览(38)
  • leetcode之只出现一次的数字

    今天为大家分享的是关于在数组中找到只出现一次数字的系列题目,我将使用c跟Java来实现,希望我的分享能够帮助到大家。 第一道题目是一个数组中只出有一个出现了一次的数字,也就是有一个单身狗。这是题目链接leetcode之只出现一次的数字 题目要求: 给你一个 非空 整

    2023年04月09日
    浏览(41)
  • leetcode-136. 只出现一次的数字

    题意描述: 给你一个 非空 整数数组 nums ,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。 你必须设计并实现线性时间复杂度的算法来解决此问题,且该算法只使用常量额外空间。 示例: 输入:nums = [2,2,1] 输出:1 输入:nums = [4,

    2024年02月07日
    浏览(39)
  • 每日一题——只出现一次的数字

    题目链接 要求为线性时间复杂度,即 时间复杂度为O(n) ,那么我们就不能用简单的两层循环来解决问题 要求只能使用常量额外空间,即 空间复杂度为O(1) ,那么我们就不能额外开辟一个数组来记录每个元素出现的次数 这里,给大家介绍一个全新的方法:位运算——异或^ 注

    2024年02月15日
    浏览(87)
  • leetcode:只出现一次的数字 Ⅲ(详解)

    前言:内容包括:题目,代码实现,大致思路,代码解读 给你一个整数数组 nums,其中恰好有两个元素只出现一次,其余所有元素均出现两次。 找出只出现一次的那两个元素。你可以按 任意顺序 返回答案。 你必须设计并实现线性时间复杂度的算法且仅使用常量额外空间来

    2023年04月09日
    浏览(34)
  • leetcode 137. 只出现一次的数字 II

    给你一个整数数组 nums ,除某个元素仅出现 一次 外,其余每个元素都恰出现 三次 。请你找出并返回那个只出现了一次的元素。 你必须设计并实现线性时间复杂度的算法且使用常数级空间来解决此问题。 示例 1: 输入:nums = [2,2,3,2] 输出:3 示例 2: 输入:nums = [0,1,0,1,0,1,

    2024年02月09日
    浏览(31)
  • lc137. 只出现一次的数字 II

      数组排序 ,既和前不一样又和后不一样的就是唯一的一个 哈希表 位运算    只有一个数出现了一次,其他数都出现了三次,那么别的数的 每个二进制位 加起来的和除3一定为0。 所以如果某个二进制位取余3不为0那么这个数就是所要求的答案的某个二进制位,再把它导出来

    2024年02月13日
    浏览(39)
  • 【vector题解】只出现一次的数字 | 电话号码的数字组合

    力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台 给你一个整数数组 nums ,其中恰好有两个元素只出现一次,其余所有元素均出现两次。 找出只出现一次的那两个元素。你可以按 任意顺序 返回答案。 你必须设计并实现线性时间复杂度的算法且仅使用常量额外空间来解决此

    2024年02月06日
    浏览(31)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包