码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 每日一练Day04:寻找单身狗


    寻找单身狗

    • 一、一个单身狗
    • 二、两个单身狗


    寻找单身狗实际上是力扣上的《只出现一次的数字》具体描述如下:

    一、一个单身狗

    本题的特点是: 非空数组、其余数字出现两次、寻找只出现一次的数字。那么如何寻找那个”单身狗“呢?

    思路:
    我们已学过异或操作符^,异或的特点是,对应二进制位相同为0,相异为1。了解这样的原理就可以很容易得到,如果对应两个相同的数字,异或结果必为0,0和非零数字异或为非零数字。已知这种原理后,如果我们将数组中的所有元素异或,出现两次的的元素将异或为0,0与“单身狗”异或恰能得到所求“单身狗”。

    理论成立,实践开始:

        public static int singleNumber(int[] array) {
            int num=0;
            for (int i = 0; i < array.length ; i++) {
                num^=array[i];
            }
            return num;
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    测试结果:


    二、两个单身狗

    本题可以说是上一题的进阶版本,难度也由简单——>中等。

    题目特点: 非空数组、其余数字都出现了两次、寻找两个只出现一次的数字。

    思路:
    对于这道题如果我们还是将所有元素异或,显然是得不到答案的。那么应该怎么做呢?解决这道问题用到了数字的分组,如果我们将存在的两个“单身狗“分别分到不同的两组中,剩下的两两相同的数字分别分到两边,依旧是异或的原理,将两组数字分别异或,最后得到的两个异或结果不就是最终答案吗?

    当然,说的简单,我们该怎样分组呢?这里提供了这样一种思路:

    1、首先我们先将所以的数字异或,由于仅有两个“单身狗”,其余数字均出现两次,这样得到的结果就相当于是两个”单身狗“异或的结果。

    2、由于我们的目的很明确,就是将两个”单身狗“分别分到两个组中,其余两两相同的数字放到它们两边即可。所以我们可以找到异或后二进制为1的位,因为二进制为1说明这是两个”单身狗“数字不同的二进制位,以此二进制位进行分组就可以将两个”单身狗“数字分别放到不同的组中,同时会将其余两两相同的数字分到他们两边,最后分别异或即可得到结果。

    可能文字描述不够直观,下面以nums = [1,2,1,3,2,5]为例,画图讲解:

    在这里插入图片描述

    理论成立,实践开始:

        public static int[] sigleNumbers(int[] array) {
            int[] nums=new int[2];
            int tmp=0;
            int i=0;
            
            //整体异或
            for (i = 0; i < array.length; i++) {
                tmp^=array[i];
            }
            
            //寻找二进制位为1的位,用于分组
            for (i=0;i<32;i++) {
                if(((tmp>>>i)&1)==1) {
                    break;
                }
            }
            
            int num1=0;
            int num2=0;
            //分组异或
            for (int j = 0; j < array.length; j++) {
                if(((array[j]>>>i)&1)==1) {
                    num1^=array[j];
                } else {
                    num2^=array[j];
                }
            }
            nums[0]=num1;
            nums[1]=num2;
            return nums;
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31

    测试结果:



    ------------------ (本章完)------------------

  • 相关阅读:
    ECharts-数据可视化复习(58th)
    【kafka】mac环境安装kafka
    Kafka怎样完成建立和Broker之间的连接?
    PingCode 完成近亿元人民币C轮融资,打造世界级研发管理与协作平台
    《Java 多线程实战系列》- 01 基本概念与底层原理
    【PythonIQ测试系统】学了一招测试一下女友的智商,这离谱的反射弧~麻了麻了(终极智商测试)
    UE4_常见动画节点学习_Two Bone IK双骨骼IK
    16:第二章:架构后端项目:12:配置mybatis;(在【imooc-news-dev-service-user】这个微服务子工程上,配置)
    WebRTC系列-SDP之编码信息收集
    修复 爱普生 EPSON L4156 打印机 无法打印,开关 WIFI 墨水 三个灯同时闪烁的问题
  • 原文地址:https://blog.csdn.net/LEE180501/article/details/127737861
  • 最新文章
  • 沪漂五周年了:我越来越迷茫了
    Agentic Skill Routing 实战:别再把所有 Skill 塞进 AI Agent 上下文
    MySQL-Seconds_behind_master的精度误差
    [MAF预定义ChatClient中间件-03]CachingChatClient——利用缓存省钱省时间
    AI的至暗历史:从万众期待到被政府撤资,AI的两次死亡徘徊
    Agent OS :五种驯服不确定性的范式
    PortSwigger SQL注入LAB11
    数据库即时编译JIT
    [Begin]AI Learn Data Day 0
    深度学习进阶(二十七)现代 LLM 的核心架构设计其二:SwiGLU
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
小工具 小游戏
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1

京公网安备 11010502049817号