C语言每日一题:10.不使用+-*/实现加法+找到所有数组中消失的数。

题目一:

请添加图片描述
题目链接:

思路一:

1.两个数二进制之间进行异或如果不产生进位操作那么两个数的和就是就是两个数进行异或的结果。
举例:5(0101)2(0010)进行异或等于:7(0111)相同为0,不同位1.
2.如果两个数之间需要进位
1.如果两个1进行异或那么这个位置就变成了0满足进位的条件。(对于两个数异或求非进位和来说)。
2.只有两个1才是进位,所以使用与的方法获取要进的位之后进行左移动。(得到进位之后的数值)。
3.进行相加,但是不可以使用加法。因为我们知道两个数之间如果不产生进位操作,按位异或就是他们的和。
4.循环判断按位与的结果为0的时候说明两个数相加不存在进位。

int Add(int num1, int num2 ) {
    // write code here
    int sum, forward;
    do
    {
        //1.每一个位置相加,不产生进位(10(1010)+2(0010)-->8(1000)不进位)
        sum = num1^num2;
        //2.找到要加的进位数(10(1010)&2(0010)-->2(0010)<<1-->4(0100))
        forward = (num1&num2) << 1;
        //3.将前两步的值相加,但是相加不能用加法,重复前面两个步骤,直到不产生进位
        num1 = sum;
         //第二步的forward值为0,说明没有位需要前进,它们的和必然是sum的值
        num2 = forward;

    } while (num2 != 0);//结束条件是不产生进位

    return num1;
}

题目二

请添加图片描述
题目链接:

>思路一:

1.使用双for循环判断。
2.从1到n循环遍历,每一个数在数组中从前到后去判断。是否存在
3.如果数组被遍历完全动没有相等的值那么说明这个外面循环的这个数不存在于数组中。

int* findDisappearedNumbers(int* nums, int numsSize, int* returnSize){
    int n = numsSize;
    int* num = (int*)calloc(n,sizeof(int));
    int count = 0;
    int j = n;
    int flag = 0;
    for (int i = 1; i <= n; i++)
    {
        int j = 0;
        for (j = 0,flag=0; j < n; j++)
        {
            if ((nums[j])==i )
            {
                flag = 1;
                break;
            }
        }

        if (flag!=1)
        {
            (*(num+count)) = i;
            count++;
            flag = 0;
        }
    }

    (*returnSize) = count;
    return num;
}

产生问题:
请添加图片描述

>思路二:

0.进行快速排序使nums先有序
1.不允许开辟额外的空间,因为有连续的数值存在。
2.从nums找出单独的数放到num中,并记录个数为count。
3.把num的内容拷贝到nums中。num的前面count个元素置为空
4.这个时候满足[1,n]中存在的数只有一个在nums中。
5.从1到n开始遍历,nums数组。
6.当nums的最后一个不是n就需要有一个k<=n的一个判断条件如果没有的化(n2是nums中单个数的元素个数)[num[n2-1],n]这些数值是会失去找不到的。

int cmp(void*p1,void*p2)
 {
     return (*((int*)p1))-(*((int*)p2));
 }
int* findDisappearedNumbers(int* nums, int numsSize, int* returnSize){
    int n = numsSize;
    int* num = (int*)calloc(n,sizeof(int));
    int count = 0;
    qsort(nums,n,sizeof(int),cmp);
    //1.从前面到后面只有一个数按照顺序放到num里面。
    num[count]=nums[0];
    count++;
    for(int i=0;i<n-1;i++)
    {
        if(nums[i+1]!=num[count-1])
        {
            num[count]=nums[i+1];
            count++;
        }
    }

    //2.把只有一个的数放回去到nums中,把num置为空。
    int n2=count;
    count=0;
    memcpy(nums,num,sizeof(int)*n2);
    memset(num,0,sizeof(int)*n2);

    //3.当nums的最后一个不是n就需要有一个k<=n
    //的一个判断条件如果没有的化[num[n2-1],n]这些数值是会失去找不到的。
    int j=0;
    int k=1;
    //1,1,2,2,这样的情况。
    //1,2,有k<=n否则是否出现这样的情况导致有的数没有判断到。
    while(j<n2||k<=n)
    {
        if(nums[j]==k)
        {
            k++;
            j++;
        }
        else
        {
            num[count++]=k;
            k++;
        }
    }
    (*returnSize) = count;
    return num;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Unity 使用SharpZipLib解压时报错

报错信息&#xff1a; NotSupportedException: Encoding 936 data could not be found. Make sure you have correct international System.Text.Encoding.GetEncoding (System.Int32 codepage) ICSharpCode.SharpZipLib.Zip.ZipConstants.ConvertToString。 出现问题分析&…

【宝藏系列】Linux 常用磁盘管理命令详解

【宝藏系列】Linux 常用磁盘管理命令详解 文章目录 【宝藏系列】Linux 常用磁盘管理命令详解前言1️⃣ df2️⃣du3️⃣fdisk&#x1f4df;磁盘格式化&#x1f4e0;磁盘检验⌨️磁盘挂载与卸除&#x1f4c0;卸载/dev/hdc6 前言 Linux磁盘管理常用三个命令为df、du和fdisk。 df…

无涯教程-Lua - 文件I/O

I/O库用于在Lua中读取和处理文件。 Lua中有两种文件操作&#xff0c;即隐式(Implicit)和显式(Explicit)操作。 对于以下示例&#xff0c;无涯教程将使用例文件test.lua&#xff0c;如下所示。 -- sample test.lua -- sample2 test.lua 一个简单的文件打开操作使用以下语句。…

Day11-Webpack前端工程化开发

Webpack 一 webpack基本概念 遇到问题 开发中希望将文件分开来编写,比如CSS代码,可以分为头部尾部内容,公共的样式。 JS代码也希望拆分为多个文件,分别引入,以后代码比较好维护。 本地图片,希望可以实现小图片不用访问后端,保存在前端代码中就可以了 运行程序时我…

mongodb docker 及常用命令

MongoDB属于非关系型数据库&#xff0c;它是由C编写的分布式文档数据库。内部使用类似于Json的bson二进制格式。 中文手册 https://www.w3cschool.cn/mongodb/ 安装 https://www.mongodb.com/try/download/community 二进制安装可见另一篇&#xff1a; centos7 mongodb 4.0.28…

RabbitMQ 教程 | 第8章 跨越集群的界限

&#x1f468;&#x1f3fb;‍&#x1f4bb; 热爱摄影的程序员 &#x1f468;&#x1f3fb;‍&#x1f3a8; 喜欢编码的设计师 &#x1f9d5;&#x1f3fb; 擅长设计的剪辑师 &#x1f9d1;&#x1f3fb;‍&#x1f3eb; 一位高冷无情的编码爱好者 大家好&#xff0c;我是 DevO…

轻量化YOLOv5改进 | 结合repghost结构冲参数化网络,实现轻量化和加速推理,

RepGhost: A Hardware-Efficient Ghost Module via Re-parameterization 论文总结本文改进repghost 核心代码测试参数量和计算量🔥🔥🔥 “引入RepGhostNet以加速CNN网络推理” “网络宽度的自定义调整:无缝嵌入YOLOv5” “通过结构重参数化优化网络性能” “实现高效和…

ChatGPT能否撰写科研论文?

ChatGPT&#xff0c;这款被许多人誉为语言处理领域的“黑马”&#xff0c;究竟能否应用于撰写科研论文&#xff1f;近期&#xff0c;以色列理工学院生物学家兼数据科学家Roy Kishony带领的团队&#xff0c;针对这一问题进行了系列研究&#xff0c;其结果已在《Nature》杂志上发…

【运维】在阿里云上搭建自己的图床,配合PicGo和Typora使用

本文将详细介绍如何在阿里云上搭建自己的图床&#xff0c;包括购买OSS服务、配置域名解析、创建OSS存储桶和设置图片上传规则等步骤。希望对您有所帮助&#xff01; 一、购买OSS服务 首先&#xff0c;我们需要在阿里云官网购买OSS(Object Storage Service)服务。OSS是阿里云提…

springBoot多数据源使用tdengine(3.0.7.1)+MySQL+mybatisPlus+druid连接池

一、安装部署 1、我这里使用的 3.0.7.1版本&#xff0c;因为我看3.x版本已经发布了一年了&#xff0c;增加了很多新的功能&#xff0c;而且3.x官方推荐&#xff0c;对于2.x的版本&#xff0c;官网都已经推荐进行升级到3.x&#xff0c;所以考虑到项目以后的发展&#xff0c;决定…

django bootstrap html实现左右布局,带折叠按钮,左侧可折叠隐藏

一、实现的效果 在django项目中,需要使用bootstrap 实现一个左右分布的布局,左侧区域可以折叠隐藏起来,使得右侧的显示区域变大。(为了区分区域,左右加了配色,不好看的修改颜色即可) 点击折叠按钮,左侧区域隐藏,右侧区域铺满: 二、实现思路 1、使用col-md属性,让左…

SOC FPGA之流水灯设计

一、DS-5简介 Altera Soc EDS开发套件的核心是Altera版ARM Development Studio 5(DS-5)工具包&#xff0c;为SoC器件提供了完整的嵌入式开发环境、FPGA自适应调试和对Altera工具的兼容。 1.1 DS-5 eclipse破解 首先下载破解器 然后进入cmd运行&#xff0c;进入到破解器所在文…

【八】mybatis 日志模块设计

mybatis 日志模块设计 简介&#xff1a;闲来无事阅读一下mybatis的日志模块设计&#xff0c;学习一下优秀开源框架的设计思路&#xff0c;提升自己的编码能力 模块设计 在Mybatis内部定义了4个级别&#xff1a;Error:错误 、warn:警告、debug:调试、trance&#xff0c;日志优…

【计算机网络】应用层协议 -- DNS协议

文章目录 1. DNS背景2. 域名简介3. 域名解析过程4. 使用dig查看DNS过程 1. DNS背景 DNS&#xff08;Domain Name System&#xff0c;域名系统&#xff09;协议&#xff0c;是一个用来将域名转化为IP地址的应用层协议。 TCP/IP当中通过IP地址和端口号的方式&#xff0c;来确定…

C语言之结构体篇(简)

结构体 结构体的认知结构体的声明一般声明特殊声明匿名结构体类型 结构体自引用结构体变量的定义与初始化结构体变量的定义结构体变量的初始化 结构体传参结构体内存对齐位段位段声明位段的内存分配位段跨平台问题: 结构体是由我们自己创造的一种类型&#xff0c;使得C语言有能…

js-匈牙利算法

匈牙利算法 素数伴侣新的改变功能快捷键合理的创建标题&#xff0c;有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants 创建一个自定义列表如何创建一个注脚注释也是必不可少的K…

H5打包封装小程序系统开发

H5打包封装小程序系统开发 H5打包封装小程序系统开发是指将H5页面打包封装成小程序的开发过程。下面是一个简单的步骤&#xff1a; 准备工作&#xff1a;首先&#xff0c;需要准备好H5页面的代码和资源文件。确保H5页面在浏览器中正常运行&#xff0c;并且没有依赖于浏览器特…

『赠书活动 | 第十六期』《深入浅出Java虚拟机:JVM原理与实战》

&#x1f497;wei_shuo的个人主页 &#x1f4ab;wei_shuo的学习社区 &#x1f310;Hello World &#xff01; 『赠书活动 &#xff5c; 第十六期』 本期书籍&#xff1a;《深入浅出Java虚拟机&#xff1a;JVM原理与实战》 赠书规则&#xff1a;评论区&#xff1a;点赞&#xff…

将Visio和Excel导出成没有白边的PDF文件

1、VISIO如何无白边导出pdf格式 在使用Latex时&#xff0c;要导入矢量图eps格式。但是VISIO无法输出eps格式&#xff0c;这就需要将其导出为pdf。但是导出pdf时&#xff0c;往往会有大量的白边。VISIO无白边导出pdf格式的方法如下&#xff1a; 1.文件——开发工具——显示sha…

并发 如何创建线程 多线程

进程&#xff1a;一个程序的执行过程 线程&#xff1a;一个方法就是一个线程 并发&#xff1a;多个线程抢夺一个资源 操作同一个对象 创建线程方法1 //创建线程方法1 继承Thread类 重写润方法 调用start开启线程 public class TestThead extends Thread{Overridepublic voi…