《剑指 Offer》专项突破版 - 面试题 4 : 只出现一次的数字(C++ 实现)

这篇具有很好参考价值的文章主要介绍了《剑指 Offer》专项突破版 - 面试题 4 : 只出现一次的数字(C++ 实现)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

题目链接:137. 只出现一次的数字 II - 力扣(LeetCode)

题目

输入一个整数数组,数组中只有一个数字出现了一次,而其他数字都出现了 3 次。请找出那个只出现一次的数字。例如,如果输入的数组为 [0, 1, 0, 1, 0, 1, 100],则只出现一次的数字是 100。

分析

这个题目有一个简化版的类似的题目 "输入数组中除了一个数字只出现一次之外其他数字都出现两次,请找出只出现一次的数字"。任何一个数字异或它自己的结果都是 0,即 x ^ x = 0。如果将数组中所有数字进行异或运算,那么最终的结果就是那个只出现一次的数字

class Solution {
public:
    int singleNumber(vector<int>& nums) {
        int result = nums[0];
        for (int i = 1; i < nums.size(); ++i)
        {
            result ^= nums[i];
        }
        return result;
    }
};

在这个题目中只有一个数字出现了一次,其他数字出现了 3 次。相同的 3 个数字异或的结果是数字本身,即 x ^ x ^ x = x,因此将数组中所有数字进行异或运算并不能消除 3 次的数字,需要想其他办法。

一个整数是由 32 个 0 或 1 组成的。我们可以将数组中所有数字的同一位置的数位相加

  1. 如果数组中所有数字的第 i 个数位相加之和能被 3 整除,那么只出现一次的数字的第 i 个数位一定是 0

    sum 为 0 或 3k(k > 0)

  2. 如果数组中所有数字的第 i 个数位相加之和被 3 除余 1,那么只出现一次的数字的第 i 个数位一定是 1

    sum 为 1 或 1 + 3k(k > 0)

代码实现

class Solution {
public:
    int singleNumber(vector<int>& nums) {
        int result = 0;
        for (int i = 0; i < 32; ++i)
        {
            int sum = 0;
            for (int j = 0; j < nums.size(); ++j)
            {
                if (nums[j] & (1 << i))
                    ++sum;
            }
​
            if (sum % 3 == 1)
                result |= 1 << i;
        }
        return result;
    }
};

举一反三

题目

输入一个整数数组,数组中只有一个数字出现 m 次,其他数字都出现 n 次,请找出那个唯一出现 m 次的数字。假设 m 不能被 n 整除

分析

如果数组中所有数字的第 i 个数位相加之和能被 n 整除,那么出现 m 次的数字的第 i 个数位一定是 0;否则出现 m 次的数字的第 i 个数位一定是 1文章来源地址https://www.toymoban.com/news/detail-786714.html

到了这里,关于《剑指 Offer》专项突破版 - 面试题 4 : 只出现一次的数字(C++ 实现)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 《剑指 Offer》专项突破版 - 面试题 15 : 字符串中的所有变位词(C++ 实现)

    题目链接 :LCR 015. 找到字符串中所有字母异位词 - 力扣(LeetCode) 题目 : 输入字符串 s1 和 s2,如何找出字符串 s2 的所有变位词在字符串 s1 中的起始下标?假设两个字符串中只包含英文小写字母。例如,字符串 s1 为 \\\"cbadabacg\\\",字符串 s2 为 \\\"abc\\\",字符串 s2 的两个变位词 \\\"c

    2024年01月18日
    浏览(76)
  • 《剑指offer》 图专项突破

    题目 海洋岛屿地图可以用由 0 、 1 组成的二维数组表示,水平或者竖直方向相连的一组 1 表示一个岛屿。请计算最大的岛屿的面积(即岛屿中 1 的数目)。例如,在图15.5中有 4 个岛屿,其中最大的岛屿的面积为 5 。 图15.5:用 0 、 1 矩阵表示的海洋岛屿地图。地图中有 4 个岛

    2024年01月16日
    浏览(63)
  • 《剑指offer》专项突破

    题目 输入两个 int 型整数,求它们除法的商,要求不得使用乘号’ * ‘、除号’ / ‘以及求余符号’ % \\\'。当发生溢出时返回最大的整数值。假设除数不为 0 。例如,输入 15 和 2 ,输出 15/2 的结果,即 7 。 参考代码 题目 输入两个表示 二进制 的字符串,请计算它们的和,并以

    2024年02月01日
    浏览(56)
  • 「SQL面试题库」 No_43 只出现一次的最大数字

    「SQL面试题库」是由 不是西红柿 发起,全员免费参与的SQL学习活动。我每天发布1道SQL面试真题,从简单到困难,涵盖所有SQL知识点,我敢保证只要做完这100道题,不仅能轻松搞定面试,代码能力和工作效率也会有明显提升。 1.1 活动流程 整理题目 :西红柿每天无论刮风下雨

    2024年02月02日
    浏览(35)
  • 只出现一次的数字

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

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

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

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

    2023年04月09日
    浏览(43)
  • 每日一题——只出现一次的数字

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

    2024年02月15日
    浏览(87)
  • leetcode-136. 只出现一次的数字

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

    2024年02月07日
    浏览(39)
  • 【举一反三】只出现一次的数字

     本文,讲位运算——异或运算。因为题干中说明要线性时间复杂度,所以采用位运算进行操作,而没有采用哈希表。 目录 1.只出现一次的数字 I  2.只出现一次的数字 II  3.只出现一次的数字 III 136. 只出现一次的数字 - 力扣(LeetCode) 题目: 给你一个 非空整数数组 nums ,除

    2023年04月15日
    浏览(40)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包