热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

漫画:位运算系列篇(只出现一次的数字)

今天是小浩算法“365刷题计划”第62天。仍然分享一道关于位运算颇为简单的题型,同时,从明天开始将会提高难度,大家做好准备。01PARTS

今天是小浩算法“365刷题计划”第62天。仍然分享一道关于位运算颇为简单的题型,同时,从明天开始将会提高难度,大家做好准备。

01

PART

Single Number

这道题,大家先想一想是用什么思路进行求解?

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

(瞪一瞪就全部掌握)

PS:建议大家停留个两分钟先想一想...直接拉下去看题解就没什么意思了。

02

PART

题目分析

位运算的题目我们已经讲了好几道了,这道也不例外,也是其中一个非常典型的例子!属于必须掌握的题型。

直接分析,我们要找只出现一次的数字,并且已知了其他的数字都只出现了两次。那么这种一听其实就应该想到需使用位运算来进行求解。最好的,就是在读完题目的瞬间,直接条件反射!(当然,如果你现在第一反应是想到 通过遍历统计,或者其他如使用hashmap 等方式来进行求解,那我觉得你的位运算这块,是有必要加强练习力度的。如果你第一反应,连思路都没有,那我觉得对于整个算法的能力这块,都是比较欠缺的,需要下苦功!)

回到题目,如何使用位运算进行求解呢?对于任意两个数a和b,我们对其使用 “异或”操作,应该有以下性质:

  • 任意一个数和0异或仍然为自己:

    a⊕0=a

  • 任意一个数和自己异或是0:

    a⊕a=0

  • 异或操作满足交换律和结合律:

a⊕b⊕a=(a⊕a)⊕b=0⊕b=b

可能有人直接都不知道异或是什么,所以还是举个例子,比如5异或3,也就是5⊕3,也就是5^3,是下面这样:

根据分析,得出代码:(c++版本)

1//CPP2class Solution {3public:4    int singleNumber(vector& nums) {5        int ans = 0;6        for (int num : nums) {7            ans ^= num;8        }9        return ans;
10    }
11};

(java版本)

1//JAVA2class Solution {3    public int singleNumber(int[] nums) {4        int ans &#61; nums[0];5        for (int i &#61; 1; i < nums.length; i&#43;&#43;) {6            ans &#61; ans ^ nums[i];7        }8        return ans;9    }
10}

(python版本)

1//py
2class Solution:
3    def singleNumber(self, nums: List[int]) -> int:
4        ans &#61; 0
5        for i in range(len(nums)):
6            ans ^&#61; nums[i]
7        return ans

郑重申明&#xff08;读我的文章必看&#xff09;&#xff1a;

  • 本系列所有教程都不会用到复杂的语言特性&#xff0c;不需要担心没有学过相关语法&#xff0c;使用各语言纯属本人爱好。

  • 作为学术文章&#xff0c;虽然风格可以风趣&#xff0c;但严谨&#xff0c;我是认真的。本文所有代码均在leetcode上进行过测试运行。

  • 算法思想才是最重要的。

03

PART

题目进阶

如果修改上面的题目&#xff0c;除了某个元素只出现一次&#xff0c;其余元素都出现了3次以上&#xff0c;那么该如何求解&#xff1f;

修改一个条件之后&#xff0c;本题的难度大幅度提升&#xff01;“异或”的方式看起来似乎没办法运用在“其余数出现3次以上”的条件中。那对于这种问题又该如何求解&#xff1f;我这里给出几种思路&#xff0c;大家下去分析一下&#xff0c;明天我会公布这道衍化题型的解决方案&#xff1a;

  • 思路1&#xff1a;使用hashmap&#xff0c;统计每个数字出现的次数&#xff0c;最后返回次数为1的数字。。。然后等待一段时间&#xff0c;接到很遗憾的通知。

  • 思路2&#xff1a;上面的题目&#xff0c;对于相同的两个数&#xff0c;进行异或运算&#xff0c;我们可以进行“抵消”&#xff0c;那是否可以找到一种方式&#xff0c;来让相同的三个数进行相互抵消呢&#xff1f;

  • 思路3&#xff1a;是不是可以通过数学的方式来进行计算&#xff1f;

&#xff08;这货就是不直接说出来&#xff0c;你说气人不气人&#xff01;&#xff09;

想复习一下其他位运算题目的&#xff0c;可以看&#xff1a;

漫画&#xff1a;三分钟学习一道位运算的面试题&#xff0c;万一遇到了呢&#xff1f;

漫画&#xff1a;位运算技巧助你俘获offer

所以&#xff0c;今天的问题你学会了吗&#xff1f;评论区留下你的想法&#xff01;

1. 全栈架构之打包推荐【建议收藏&#xff0c;常读】

2. 一个空格引发的“惨案“

3. 分布式系统中Session共享的常用方案

4. Java语言“坑爹”排行榜TOP 10

5. 我是一个Java类&#xff08;附带精彩吐槽&#xff09;

6. mysql索引失效&#xff0c;差点我的工作凉了

7. 既生synchronized&#xff0c;何生volatile&#xff1f;

8. 微服务一直火&#xff0c;为什么服务化要搞懂&#xff1f;

9. MySQL的COUNT语句&#xff0c;不简单&#xff01;

10. 漫画&#xff1a;HashSet和TreeSet实现与原理

扫码二维码关注我

·end·

—如果本文有帮助&#xff0c;请分享到朋友圈吧—

我们一起愉快的玩耍&#xff01;

你点的每个赞&#xff0c;我都认真当成了喜欢


推荐阅读
  • 深入解析ESFramework中的AgileTcp组件
    本文详细介绍了ESFramework框架中AgileTcp组件的设计与实现。AgileTcp是ESFramework提供的ITcp接口的高效实现,旨在优化TCP通信的性能和结构清晰度。 ... [详细]
  • 由二叉树到贪心算法
    二叉树很重要树是数据结构中的重中之重,尤其以各类二叉树为学习的难点。单就面试而言,在 ... [详细]
  • 并发编程 12—— 任务取消与关闭 之 shutdownNow 的局限性
    Java并发编程实践目录并发编程01——ThreadLocal并发编程02——ConcurrentHashMap并发编程03——阻塞队列和生产者-消费者模式并发编程04——闭锁Co ... [详细]
  • 本文深入探讨了MySQL中常见的面试问题,包括事务隔离级别、存储引擎选择、索引结构及优化等关键知识点。通过详细解析,帮助读者在面对BAT等大厂面试时更加从容。 ... [详细]
  • 1.执行sqlsever存储过程,消息:SQLServer阻止了对组件“AdHocDistributedQueries”的STATEMENT“OpenRowsetOpenDatas ... [详细]
  • 深入解析SpringMVC核心组件:DispatcherServlet的工作原理
    本文详细探讨了SpringMVC的核心组件——DispatcherServlet的运作机制,旨在帮助有一定Java和Spring基础的开发人员理解HTTP请求是如何被映射到Controller并执行的。文章将解答以下问题:1. HTTP请求如何映射到Controller;2. Controller是如何被执行的。 ... [详细]
  • 本文将探讨2015年RCTF竞赛中的一道PWN题目——shaxian,重点分析其利用Fastbin和堆溢出的技巧。通过详细解析代码流程和漏洞利用过程,帮助读者理解此类题目的破解方法。 ... [详细]
  • CSS高级技巧:动态高亮当前页面导航
    本文介绍了如何使用CSS实现网站导航栏中当前页面的高亮显示,提升用户体验。通过为每个页面的body元素添加特定ID,并结合导航项的类名,可以轻松实现这一功能。 ... [详细]
  • 深入解析Spring启动过程
    本文详细介绍了Spring框架的启动流程,帮助开发者理解其内部机制。通过具体示例和代码片段,解释了Bean定义、工厂类、读取器以及条件评估等关键概念,使读者能够更全面地掌握Spring的初始化过程。 ... [详细]
  • 本文介绍了如何在 C# 和 XNA 框架中实现一个自定义的 3x3 矩阵类(MMatrix33),旨在深入理解矩阵运算及其应用场景。该类参考了 AS3 Starling 和其他相关资源,以确保算法的准确性和高效性。 ... [详细]
  • 本文回顾了2017年的转型和2018年的收获,分享了几家知名互联网公司提供的工作机会及面试体验。 ... [详细]
  • 版本控制工具——Git常用操作(下)
    本文由云+社区发表作者:工程师小熊摘要:上一集我们一起入门学习了git的基本概念和git常用的操作,包括提交和同步代码、使用分支、出现代码冲突的解决办法、紧急保存现场和恢复 ... [详细]
  • 本文详细介绍了 Python 中的条件语句和循环结构。主要内容包括:1. 分支语句(if...elif...else);2. 循环语句(for, while 及嵌套循环);3. 控制循环的语句(break, continue, else)。通过具体示例,帮助读者更好地理解和应用这些语句。 ... [详细]
  • 本文探讨了在Django项目中,如何在对象详情页面添加前后导航链接,以提升用户体验。文章详细描述了遇到的问题及解决方案。 ... [详细]
  • 深入解析 Android IPC 中的 Messenger 机制
    本文详细介绍了 Android 中基于消息传递的进程间通信(IPC)机制——Messenger。通过实例和源码分析,帮助开发者更好地理解和使用这一高效的通信工具。 ... [详细]
author-avatar
mce
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有