【每日刷题】Day25

【每日刷题】Day25

🥕个人主页:开敲🍉

🔥所属专栏:每日刷题🍍

🌼文章目录🌼

1. 238. 除自身以外数组的乘积 - 力扣(LeetCode)

2. 82. 删除排序链表中的重复元素 II - 力扣(LeetCode)

3. 445. 两数相加 II - 力扣(LeetCode)

1. 238. 除自身以外数组的乘积 - 力扣(LeetCode)

//思路:使用两个数组,分别存储左边元素的乘积和、右边元素的乘积和,在使用一个数组,存储这两个数组的每个位置元素的和。

int* productExceptSelf(int* nums, int numsSize, int* returnSize)

{

    int * ans = (int*)malloc(sizeof(int)*numsSize);

    int left[numsSize];//用于存储左边元素乘积和

    int right[numsSize];//用于存储右边元素乘积和

    int i = 0;

    left[0] = 1;

    for(i = 1;i<numsSize;i++)//计算原数组各个位置左边元素乘积

    {

        left[i] = left[i-1]*nums[i-1];

    }

    right[numsSize-1] = 1;

    for(i = numsSize-2;i>=0;i--)//计算原数组各个位置右边元素乘积

    {

        right[i] = right[i+1]*nums[i+1];

    }

    for(i = 0;i<numsSize;i++)

    {

        ans[i] = left[i]*right[i];//相加则是原数组各个位置除自身以外的元素乘积和

    }

    *returnSize = numsSize;

    return ans;

}

2. 82. 删除排序链表中的重复元素 II - 力扣(LeetCode)

//思路:哈希。这题由于链表中的元素存在小于0的,因此使用哈希时需要将小于0的数处理为>0的数。因为数据范围为-100~100,因此,可以将<0的数+201,将数据范围改为0~200,这样就可以使用哈希来解决。

typedef struct ListNode LN;

struct ListNode* deleteDuplicates(struct ListNode* head)

{

    if(head==NULL)

    {

        return NULL;

    }

    if(head->next==NULL)

    {

        return head;

    }

    int hash[1000] = {0};

    LN* pmove = head;

    while(pmove)

    {

        if(pmove->val<0)

        {

            pmove->val+=201;//将链表中小于0的数处理为>100的数

        }

        hash[pmove->val]+=1;//计算数据出现的次数

        pmove = pmove->next;

    }

    LN* Sentry = (LN*)malloc(sizeof(LN));//新链表用于接收只出现一次的数

    Sentry->next = NULL;

    LN* newhead = Sentry;

    if(head->val>100)//这里需要考虑链表中是否存在小于0的数,如果存在,则新链表接收数据的顺序需要相应改变

    {

        for(int i = 101;i<=200;i++)//先将<0的数存入新链表

    {

        if(hash[i]==1)//==1说明数据只出现了一次,存入新链表

        {

        LN* newnode = (LN*)malloc(sizeof(LN));

        newnode->next = NULL;

        newnode->val = i-201;

        newhead->next = newnode;

        newhead = newhead->next;

        }

    }

    for(int i = 0;i<=100;i++)//再存入>0的数

    {

        if(hash[i]==1)

        {

        LN* newnode = (LN*)malloc(sizeof(LN));

        newnode->next = NULL;

        newnode->val = i;

        newhead->next = newnode;

        newhead = newhead->next;

        }

    }

    }

    else

    {

        for(int i = 0;i<=100;i++)//链表中不存在<0的数则直接存储即可

        {

            if(hash[i]==1)

            {

                LN* newnode = (LN*)malloc(sizeof(LN));

                newnode->next = NULL;

                newnode->val = i;

                newhead->next = newnode;

                newhead = newhead->next;

            }

        }

    }

    return Sentry->next;

}

3. 445. 两数相加 II - 力扣(LeetCode)

//思路:使用两个数组arr1、arr2分别存储l1和l2的val。然后分别从后往前遍历数组相加存储进数组arr中,步骤和67. 二进制求和 - 力扣(LeetCode)//一致。最后再创建一个新链表,将数组arr中的数据存储进新链表返回

typedef struct ListNode LN;


 

int max(int x,int y)

{

    return x>y?x:y;

}

struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2)

{

    LN* Sentry = (LN*)malloc(sizeof(LN));//新链表的哨兵位

    Sentry->next = NULL;

    LN* newhead = Sentry;

    int i = 0;

    int j = 0;

    int arr1[100] = {0};

    int arr2[100] = {0};

    int arr[101] = {0};

    LN* pmove1 = l1;

    LN* pmove2 = l2;

    int flag = 0;

    while(pmove1)//将l1的val存进arr1

    {

        arr1[i++] = pmove1->val;

        pmove1 = pmove1->next;

    }

    while(pmove2)//将l2的val存进arr2

    {

        arr2[j++] = pmove2->val;

        pmove2 = pmove2->next;

    }

    i--;//定位到数组的最后一个元素

    j--;

    int max1 = max(i,j);//用于判断arr数组中存储数据的长度,arr0下标的位置需要空出来

    int max2 = max1;

    while(i>=0||j>=0)

    {

        int x = (i>=0)?arr1[i]:0;

        int y = (j>=0)?arr2[j]:0;

        arr[max2+1] = (x+y+flag)%10;//max2+1能够保证arr中0位置空出,并且存储进arr1、arr2相加后的数

        if(x+y+flag>=10)

        {

            flag = 1;

        }

        else

        {

            flag = 0;

        }

        max2--;

        if(i>=0)

        {

            i--;

        }

        if(j>=0)

        {

            j--;

        }

    }

    if(flag)//如果出了循环flag还为1,说明最高位也进了位,将arr数组0位置处的元素置为1

    {

        arr[0] = 1;

        for(i = 0;i<=max1+1;i++)//从arr数组0位置开始将数据存入新链表

    {

        LN* newnode = (LN*)malloc(sizeof(LN));

        newnode->next = NULL;

        newnode->val = arr[i];

        newhead->next = newnode;

        newhead = newhead->next;

    }

    }

    else

    {

        for(i = 1;i<=max1+1;i++)//如果flag为0,则说明最高位没有进1,则直接从arr数组1位置开始存入

    {

        LN* newnode = (LN*)malloc(sizeof(LN));

        newnode->next = NULL;

        newnode->val = arr[i];

        newhead->next = newnode;

        newhead = newhead->next;

    }

    }

    return Sentry->next;

}

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

手写文字和数字的自动识别

文章目录 题目要求实现方法1&#xff1a;pytesseractpython的OCR工具pytesseractpytesseract介绍OCR介绍pytesseract的安装以及环境配置 页面展示代码实现优缺点分析 实现方法2&#xff1a;PaddleOCRPaddleOCR介绍页面展示实现代码优缺点分析 实现方法3&#xff1a;EasyOCREasy…

工作记录:vue-grid-layout 修改 margin 导致 item 高度剧烈变化

问题 用 vue-gird-layout 时发现&#xff0c;当改变 margin 值时&#xff0c;item 的尺寸也会跟着变化。 如下图&#xff1a;row height 和每个 item 的 h 都保持不变。修改 margin-y&#xff0c;item 的实际高度也跟着变了&#xff1a; 原因 研究了一番&#xff0c;发现原…

Ubuntu下载的nginx的位置

位置在/etc/nginx 启动nginx systemctl status nginx上面的命令不合适&#xff0c;就重启nginx sudo service nginx restart 关闭nginx nginx -s stop Ubuntu默认的html地址在该文件夹中的default中&#xff1a; /etc/nginx/sites-available if ($http_host ~* "^(w…

Linux深入了解文件系统和日志分析

目录 一.inode & block inode和block概述 block(块) inode(索引节点)​编辑 inode的内容 inode包含文件的元信息 用stat命令可以查看某个文件的inode信息 Linux系统文件三个主要的时间属性 目录文件的结构 inode的号码 用户通过文件名打开文件时&#xff0c;系统…

GPU版本torch使用教程

GPU版本torch使用教程 一、下载配置CUDA和CUDNN &#xff08;1&#xff09;进入cmd使用nvidia-smi.exe查看自己电脑支持的最新CUDA版本&#xff08;可以下载地低版本&#xff09;&#xff0c;如图&#xff1a; 也可以通过NVIDIA控制面板&#xff08;NVIDIA Control Panel&am…

JAVA MQTT 发布主题请求,订阅主题接收,订阅主题回复,发布主题再接收回复,三步走

先看效果 一、准备工作 1.官网下载emqx压缩包放到自己的盘符下&#xff0c;不要带中文路径 下载 EMQX 2.在路径的bin中&#xff0c;cmd&#xff0c;启动emqx服务 emqx start 3.访问服务&#xff0c;能打开就证明启动成功&#xff0c;登录的话官网默认的密码账号&#xff08;…

实现SpringMVC底层机制(二)

文章目录 1. 动态获取spring配置文件1.修改SunWebApplicationContext.java2.修改SunDispatcherServlet.java 2.自定义Service注解1.需求分析2.编写Monster.java3.自定义Service注解4.编写Service接口MonsterService.java5.编写Service实现类MonsterServiceImpl.java6.修改SunWe…

linux系统下载huggingface大模型教程

文章目录 准备工作添加SSH Key生成Access Token 模型下载公开模型下载&#xff08;bert-base-chinese为例&#xff09;非公开模型下载&#xff08;Llama3为例&#xff09;权限申请官网预训练模型下载huggingface仓库下载 准备工作 添加SSH Key # 本地机器生成ssh key # step1…

JavaScript-3(内置对象+数组对象+字符串对象)

目录 1.预解析 2.对象 什么是对象 创建对象的三种方法 利用字面量创建方法 利用new Object创建对象 构造函数创建对象 new关键字 遍历对象 3.内置对象 Math对象 Math概述 Math随机数 Date日期对象 格式化日期 Date总的时间毫秒 4.数组对象 创建数组的两种方式…

OpenHarmony实战开发-按钮 (Button)

Button是按钮组件&#xff0c;通常用于响应用户的点击操作&#xff0c;其类型包括胶囊按钮、圆形按钮、普通按钮。Button做为容器使用时可以通过添加子组件实现包含文字、图片等元素的按钮。具体用法请参考Button。 创建按钮 Button通过调用接口来创建&#xff0c;接口调用有…

JetBrains CLion v2023.3.4 激活版 (C/C++ 集成开发IDE)

前言 JetBrains CLion是一款跨平台的C/C集成开发环境&#xff0c;由JetBrains公司推出。其最新版本支持C14几乎完全&#xff0c;并初步支持C17&#xff0c;使得编写代码更加便捷。CLion还提供了Disassembly view&#xff08;反汇编视图&#xff09;&#xff0c;即使没有源代码…

C++对象的初始化和处理

生活中我们买的电子产品都基本会有出厂设置!在某一天我们不用时候也会删除一些自己信息数据保证安全。 C中的面向对象来源于生活&#xff0c;每个对象也都会有初始设置以及对象销毁前的清理数据的设置。 构造函数和析构函数 对象的初始化和清理也是两个非常重要的安全问题 一…