[LeetCode]只出现一次的数字相关题目(c语言实现)

news2024/9/25 1:16:12

文章目录

  • LeetCode136. 只出现一次的数字Ⅰ
  • LeetCode137. 只出现一次的数字 II
  • LeetCode260. 只出现一次的数字 III
  • LeetCode268. 丢失的数字

LeetCode136. 只出现一次的数字Ⅰ

  • 题目:

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

  • 要求

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

  • 思路
    位运算:异或运算
    • a ^ 0 = a
    • a ^ a = 0
    • a ^ b ^ a = b

定义一个变量x = 0,将数组所有的元素进行异或运算,结果即是单独的数字

  • 实例

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

2 ^ 2 ^ 1 = 1

  • 代码实现
int singleNumber(int* nums, int numsSize)
{
    int x = 0;
    int i = 0;

    for (i = 0; i < numsSize; i++)
    {
        x ^= nums[i];
    }

    return x;
}

LeetCode137. 只出现一次的数字 II

  • 题目

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

  • 要求

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

  • 思路
    位运算:与运算
    • (a >> 0) & 1得到最后一位
    • (a >> 1) & 1得到倒数第二位
    • (a >> 2) & 1得到倒数第三位

int类型有 32 位,将数组所有元素按位相加,得到的结果模 3 即 单个元素在该位的数

注意: 在c语言中, int类型被规定左移位数 (i >= 0 && i < 31).而unsigned int类型被规定左移数 (i >=0 && i <= 31).因此需要使用无符号数1u

  • 实例

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

在这里插入图片描述

  • 代码实现
int singleNumber(int* nums, int numsSize)
{
    int x = 0;
    int i = 0;
    int j = 0;
    
    for (i = 0; i < 32; i++)
    {
        int sum_bit = 0;    //记录数组所有第i位的和

        for (j = 0; j < numsSize; j++)
        {
            sum_bit += (nums[j] >> i) & 1;
        }

        if (sum_bit % 3)    //如果不能整除3,单个元素在第 i 位有 1
        {
            x |= 1u << i;
        }
    }

    return x;
}

LeetCode260. 只出现一次的数字 III

  • 题目

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

  • 要求

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

  • 思路
    位运算: 异或运算 和 与运算
  1. 得到两个数的异或结果 xornum
  2. 取到 xornumxorbit 为 1 的数, 只要一个即可
  3. 数组所有元素分成两组, 第 xorbit 位为 1 分成一组, 第 xorbit 位为 0 分成一组
  4. 每组元素全部异或,两组的两个异或结果即为两个单独元素
  • 实例

输入:nums = [1,2,1,3,2,5]
输出:[3,5]
解释:[5, 3] 也是有效的答案。

在这里插入图片描述

  • 代码实现
int* singleNumber(int* nums, int numsSize, int* returnSize)
{
    int *ret = (int*)calloc(sizeof(int), 2);    //存放两个数的数组
    int xornum = 0;          //存放两个数的异或结果
    int i = 0;
    int xorbit = 0;

    //先得到两个数的异或结果
    for (i = 0; i < numsSize; i++)
    {
        xornum ^= nums[i];
    }

    //找到异或结果中是 1 的一位,说明这两个数在这一位一个是 1, 一个是0
    for (i = 0; i < 31; i++)    //int类型最多左移30位
    {
        if ((xornum >> i) & 1 == 1)
        {
            xorbit = i;
            break;
        }
    }

    //随后将数组元素进行分组: 元素在该位是 1 分一组;元素在该位是 0 分一组
    //同时将每组元素进行异或, 得到结果

    for (i = 0; i < numsSize; i++)
    {
        if ((nums[i] >> xorbit) & 1 == 1)
        {
            ret[0] ^= nums[i];
        }
        else
        {
            ret[1] ^= nums[i];
        }
    }
    
    *returnSize = 2;
    return ret;
}

LeetCode268. 丢失的数字

  • 题目

给定一个包含 [0, n]n 个数的数组 nums ,找出 [0, n] 这个范围内没有出现在数组中的那个数。OJ链接

  • 思路
    位运算: 异或运算

数组所有元素 和 [0, n] 一起异或, 异或结果为丢失的数字
实际也是单身狗思路

  • 实例

输入:nums = [3,0,1]
输出:2
解释:n = 3,因为有 3 个数字,所以所有的数字都在范围 [0,3] 内。2 是丢失的数字,因为它没有出现在 nums 中。

[3,0,1][0, 3] 所有元素异或, 可以理解为找出 [0,0,1,1,2,3,3] 中仅出现一次的数字

  • 代码实现
int missingNumber(int* nums, int numsSize)
{
    int i = 0;
    int xornum = 0;

    //先得到 [0, n] 的异或结果
    for (i = 0; i <= numsSize; i++)
    {
        xornum ^= i;
    }

    //再将异或结果与数组所有元素异或
    for (i = 0; i < numsSize; i++)
    {
        xornum ^= nums[i];
    }

    return xornum;
}

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

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

相关文章

使用MyBatis(2){使用myBatis操作增删改查/动态SQL}

目录 一、定义接口、实体类、创建XML文件实现接口&#xff09; 二、MyBatis的增删改查 &#x1f345;1、MyBatis传递参数查询 &#x1f388;写法一 &#x1f388;写法二 &#x1f388;两种方式的区别 &#x1f345;2、删除操作 &#x1f345;3、根据id修改用户名 &#…

Java 基础进阶总结(一)反射机制学习总结

文章目录 一、初识反射机制1.1 反射机制概述1.2 反射机制概念1.3 Java反射机制提供的功能1.4 反射机制的优点和缺点 二、反射机制相关的 API2.1 一、初识反射机制 1.1 反射机制概述 JAVA 语言是一门静态语言&#xff0c;对象的各种信息在程序运行时便已经确认下来了&#xff0…

延长周末体验感

延长周末体验感 写在最前面周末的时间规划题外话善解人意的chatgpt 提升周末体验感的好方法随机选择一个周末活动 怎样才能获得充分的休息 写在最前面 话题征文~ https://activity.csdn.net/creatActivity?id10533&spm1011.2432.3001.9644 工作以后常常容易感到疲于奔命…

python简单小游戏代码100行,python小游戏程序源代码

大家好&#xff0c;小编来为大家解答以下问题&#xff0c;python简单小游戏代码100行&#xff0c;python小游戏代码能用的&#xff0c;现在让我们一起来看看吧&#xff01; Python编写简易猜数字小游戏&#xff08;附完整代码&#xff09; 猜数字游戏是一款非常经典的小游戏&am…

AD21 PCB设计的高级应用(九)3D PDF的输出

&#xff08;九&#xff09;3D PDF的输出 1.3D PDF的输出2.制作PCB 3D视频 1.3D PDF的输出 Altium Designer 19 带有 3D输出功能,能够直接将 PCB 的 3D效果输出到 PDF 中。 ’(1)打开带有 3D 模型的 PCB 文件,执行菜单栏中“文件”→“导出”→“PDF3D”命令&#xff0c;选择…

P1419 寻找段落(二分答案)(内附封面)

寻找段落 题目描述 给定一个长度为 n n n 的序列 a a a&#xff0c;定义 a i a_i ai​ 为第 i i i 个元素的价值。现在需要找出序列中最有价值的“段落”。段落的定义是长度在 [ S , T ] [S, T] [S,T] 之间的连续序列。最有价值段落是指平均值最大的段落。 段落的平均值…

SpringBoot整合TrueLicense生成和验证License证书

一 License介绍 License&#xff0c;也就是版权许可证书&#xff0c;一般用于收费软件给付费用户提供的访问许可证明。根据应用部署位置的不同&#xff0c;一般可以分为以下几种情况讨论&#xff1a; 应用部署在开发者自己的云服务器上。这种情况下用户通过账号登录的形式远程…

Halcon——在C#中各数据类型的相互转换

Halcon——在C#中各数据类型的相互转换 前言一、HObject to1.HObject to HImage 二、HTuple to1.HTuple to Int2.HTuple to Double3.HTuple to String4.HTuple to long5.HTuple to object6.HTuple to Arr 总结 前言 用c#进行Halcon代码转换的时候&#xff0c;虽然有halcon自带…

Python基础语法-梳理的几个知识点

1.书写格式 不需要声明变量类型&#xff0c;因为 在python中&#xff0c;变量为弱类型变量&#xff0c;Python解析器根据值自动匹配变量类型分支结构、循环结构中的条件表达式&#xff0c;不需要用小括号括起来执行语句体不需要大括号括起来&#xff0c;而是用冒号代替 2.格式…

GRNN神经网络原理与matlab实现

1案例背景 1.1GRNN神经网络概述 广义回归神经网络(GRNN Generalized Regression Neural Network&#xff09;是美国学者 Don-ald F. Specht在1991年提出的,它是径向基神经网络的一种。GRNN具有很强的非线性映射能力和柔性网络结构以及高度的容错性和鲁棒性,适用于解决非线性问…

使用 JMeter 进行压力测试

一.前言 压力测试是每一个Web应用程序上线之前都需要做的一个测试&#xff0c;他可以帮助我们发现系统中的瓶颈问题&#xff0c;减少发布到生产环境后出问题的几率&#xff1b;预估系统的承载能力&#xff0c;使我们能根据其做出一些应对措施。所以压力测试是一个非常重要的步…

套接字通信(C/C++ 多线程)----基于线程池的并发服务器

&#xff08;一&#xff09;大家可以看我写的这三篇&#xff0c;了解一下&#xff1a; 基于linux下的高并发服务器开发&#xff08;第四章&#xff09;- 多线程实现并发服务器_呵呵哒(&#xffe3;▽&#xffe3;)"的博客-CSDN博客https://blog.csdn.net/weixin_4198701…

Jmeter如何添加插件

一、前言 ​ 在我们的工作中&#xff0c;我们可以利用一些插件来帮助我们更好的进行性能测试。今天我们来介绍下Jmeter怎么添加插件&#xff1f; 2023最新Jmeter接口测试从入门到精通&#xff08;全套项目实战教程&#xff09; 二、插件管理器 ​ 首先我们需要下载插件管理器j…

一个完整的http请求响应过程

一、 HTTP请求和响应步骤 图片来自&#xff1a;理解Http请求与响应 以上完整表示了HTTP请求和响应的7个步骤&#xff0c;下面从TCP/IP协议模型的角度来理解HTTP请求和响应如何传递的。 二、TCP/IP协议 TCP/IP协议模型&#xff08;Transmission Control Protocol/Internet Pr…

04、并发用户数该怎么计算

什么是并发&#xff1f; 我们假设上图中的这些小人是严格按照这个逻辑到达系统的&#xff0c;那显然&#xff0c;系统的绝对并发用户数是 4。如果描述 1 秒内的并发用户数&#xff0c;那就是 16。是不是显而易见&#xff1f;但是&#xff0c;在实际的系统中&#xff0c;用户通常…

若依框架 - 对二次封装数据分页

LsDistrictController /*** 查询地段列表*/ApiOperation("查询地段列表")GetMapping("/list")public TableDataInfo list(LsDistrict lsDistrict) {startPage();Map<String, List> map lsDistrictService.selectLsDistrictList(lsDistrict);if (Col…

java类和对象详解(1)

面向对象的初步认知 什么是面向对象 Java是一门纯面向对象的语言(Object Oriented Program, 简称OOP),在面向对象的世界里&#xff0c;一切皆为对象。面向对象是解决问题的一种思想&#xff0c;主要依靠对象之间的交互完成一件事情。 用面向对象的思想来涉及程序&#xff0c;更…

AntdesignVue 时间设置为年份不回显问题解决

时间设置为年份回显时报如下错误 年份设置值后报value异常 解决方案 格式不一致导致的 moment格式化后是string类型&#xff0c;后台返回的是Number类型导致的&#xff0c;统一格式就会显示了

人工智能安全-3-噪声数据处理

0 提纲 噪声相关概述噪声处理的理论与方法基于数据清洗的噪声过滤主动式过滤噪声鲁棒模型1 噪声相关概述 噪声类型: 属性噪声:样本中某个属性的值存在噪声标签噪声:样本归属类别关于噪声分布的假设:均匀分布、高斯分布、泊松分布等。 标签噪声的产生原因: (1)特定类别…