草庐IT

leedcode刷题(1)

不能再留遗憾了 2023-04-14 原文

各位朋友们,大家好,从今天开始我将陆续为大家更新我自己每天的leedcode刷题,我将会为大家说明每一步的来由,保证你一天新学会几道题目。各位朋友可以跟着博主每天刷几道题,相信两个月后大家的代码能力可以得到明显的提高。那么接下来就开始今天的刷题之路了哦。

文章目录

两数相加

leedcode两数相加(难度:中等)

题目要求

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */

给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。

请你将两个数相加,并以相同形式返回一个表示和的链表。

你可以假设除了数字 0 之外,这两个数都不会以 0 开头。

用例输入

示例 1:

输入:l1 = [2,4,3], l2 = [5,6,4]
输出:[7,0,8]
解释:342 + 465 = 807.

示例 2:
输入:l1 = [0], l2 = [0]
输出:[0]

示例 3:
输入:l1 = [9,9,9,9,9,9,9], l2 = [9,9,9,9]
输出:[8,9,9,9,0,0,0,1]

做题思路

因为题目给的链表就是倒序的,而我们平时做加法时也是从两个数字的个位开始加的,如果相加结果大于进位,就向前一位进一,并且当前位减去进位。
我们还需要注意的是,这道题没有说两个链表的长度相同,所以当到达了其中一个链表的尾结点时,就把当前链表的上一位当作0。并且当两个链表都到达了尾结点时,我们还需要做出判断,判断是否还有进位值,如果有我们就需要额外创建一个结点来放这个进位值。

代码实现

struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2) {
//创建一个哨兵位,不动的头结点
    struct ListNode* head = (struct ListNode*)malloc(sizeof(struct ListNode));
    //cur1来连接返回的链表上的每一个结点
    struct ListNode* cur1 = head;
//创建临时变量来存放进位值
    int tmp = 0;
    //当l1和l2都为NULL时,结束循环
    while (l1 || l2)
    {
//这里是判断l1或l2是否到达了尾结点,如果到了,那么该链表结点的值为0
        int n1 = l1 ? l1->val : 0;
        int n2 = l2 ? l2->val : 0;
        int sum = n1 + n2 + tmp;
        struct ListNode* newNode = (struct ListNode*)malloc(sizeof(struct ListNode));
        newNode->val = sum % 10;
        cur1->next = newNode;
        cur1 = cur1->next;
        tmp = sum / 10;
        if (l1)
        {
            l1 = l1->next;
        }
        if (l2)
        {
            l2 = l2->next;
        }
    }
//判断当l1和l2都到达了尾结点时,是否还有进位值
    if (tmp > 0)
    {
        struct ListNode* newNode1 = (struct ListNode*)malloc(sizeof(struct ListNode));
        newNode1->val = 1;
        cur1->next = newNode1;
    }

    return head->next;
}

我们写完了代码之后我们来运行一下,看看是否能通过。

当我们提交的时候会出现这个执行错误,那么这是为什么呢?这并不代表我们的代码有问题,而是因为leedcode的标准比较严格,我们在创建一个新结点的时候必须将该结点的next指针赋值。所以我们需要在创建结点的时候将next指针置为NULL。

struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2) {
    struct ListNode* head = (struct ListNode*)malloc(sizeof(struct ListNode));
    head->next = NULL;
    struct ListNode* cur1 = head;
    int tmp = 0;
    while (l1 || l2)
    {
        int n1 = l1 ? l1->val : 0;
        int n2 = l2 ? l2->val : 0;
        int sum = n1 + n2 + tmp;
        struct ListNode* newNode = (struct ListNode*)malloc(sizeof(struct ListNode));
        newNode->next = NULL;
        newNode->val = sum % 10;
        cur1->next = newNode;
        cur1 = cur1->next;
        tmp = sum / 10;
        if (l1)
        {
            l1 = l1->next;
        }
        if (l2)
        {
            l2 = l2->next;
        }
    }
    if (tmp > 0)
    {
        struct ListNode* newNode1 = (struct ListNode*)malloc(sizeof(struct ListNode));
        newNode1->next = NULL;
        newNode1->val = 1;
        cur1->next = newNode1;
    }

    return head->next;
}

无重复字符的最长字串

leedcode之无重复字符的最长字串(难度:中等)

题目要求

给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。

用例输入

示例 1:
输入: s = “abcabcbb”
输出: 3
解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。

示例 2:
输入: s = “bbbbb”
输出: 1
解释: 因为无重复字符的最长子串是 “b”,所以其长度为 1。

示例 3:
输入: s = “pwwkew”
输出: 3
解释: 因为无重复字符的最长子串是 “wke”,所以其长度为 3。
请注意,你的答案必须是 子串 的长度,“pwke” 是一个子序列,不是子串。

做题思路

我们这个题使用双指针来解决,一个指针用来记住新的字符串的第一个元素的地址,另一个指针用来遍历字符串。当遍历字符串的指针指向的内容没有重复时,那么我们怎样知道当前的字符是否有重复呢?我们创建一个大小为128的数组,将字符所代表的ASCII码值作为数组下标。如果没有重复我们的计数器就加1,如果有重复就返回到那个记忆指针所在的位置。然后遍历的字符串再继续走,知道到达字符串的’\0’位置。

代码实现

int lengthOfLongestSubstring(char* s) {
//s1是记忆指针
    char* s1 = s;
//s2指针用来遍历字符串
    char* s2 = s;
    char arr[128] = { 0 };
//初始化数组,将数组的元素都初始化为0
    memset(arr, 0, 128);
    int count = 0;
//max用来存储最长的无重复字符的长度
    int max = 0;
    while (*s2 != '\0')
    {
        if (arr[*s2] == 0)
        {
    //我们向数组中对应下标第一次存放数据时,存放完成就将该下标的数据改为1
            arr[*s2] = 1;
            count++;
        }
        else
        {
    //如果有重复元素,就重新把数组中元素的数据初始化
            memset(arr, 0, 128);
            if (count > max)
            {
                max = count;
            }
            count = 0;
            s2 = s1;
            s1++;
        }
        s2++;
    }
//这里做判断是防止字符串中没有重复的字符,然后max就没有被赋值
    if(count>max)
    {
        max = count;
    }
    return max;
}

小结

那么这些就是我今天的分享了,希望对大家能有帮助。如果大家有更优的解法,欢迎大家在评论区留言。如果觉得博主写的不错,记得点个关注和赞,跟着博主每天几道代码题。

有关leedcode刷题(1)的更多相关文章

  1. 面试总结+力扣第二天刷题 - 2

    一.面试总结    4月20号下午进行了一场大数据视频面试,总结一下踩坑点:    1.确定面试后,第一件事要和HR确定面试方式,具体时间、地点、什么软件、岗位JD等必须信息。        这里很多人有一个思想误区,认为问的太多会给HR不好的印象;其实大可不必,如果你通过了简历筛选,你就有权力使用公司招聘的人力资源。    2.要在面试10分钟前就进入面试的环境中,以防突发事件。    3.面试最开始都会有一个自我介绍环节,这个自我介绍环节,一定要慎之又慎,最好写下来,让朋友、长辈等审核多遍。    注:我面试时,在这踩了一个坑,自我介绍的时候踩了我要面试的岗位一脚,被技术面试官抓住了这一点

  2. 【算法刷题】贪心算法题型及方法归纳 - 2

    贪心算法特点从局部最优解推出全局最优,并且想不出来反例。贪心没有明确有规律的套路,而对于贪心的难题,更多的是难在思路上,要用一些转化问题的思维方法,然后,再根据局部最优解推出全局最优。参考文章:贪心算法理论基础1、发饼干先排序,按饼干从小到大的顺序,依次分给从小到大排序的小朋友。127、【贪心算法】leetcode——455.分发饼干:DFS+双指针法(C++版本)2、0水准线count用来记录当前子序列的相加和,当count大于0时,继续相加。当count小于或等于0时,重新开始选取子序列。以count是否为0判定的原因:若后续为正数时,没有这个负数更好,若后续为负数时,越加只会越小)129

  3. LeetCode刷题中出现的奇怪的错误及解决办法 - 2

    目录前言: 案例1:案例2: 案例3:案例4:前言:一般我在刷leetcode题的时候既不喜欢在Playground也不喜欢在本地编译器里面打代码,而是直接在题目后的窗口里写代码。于是对于我这种氪不起金的玩家来说,经常就会出现奇怪的bug,找了半天也找不到。这里就对以前遇到过的问题进行总结。 案例1:我找了老半天问题在哪里。发现不管在for循环后面加什么语句都会出错。最后放到visualstudio里面才发现了错误。。。错误原因:c++注释行尾的反斜杠会将下一行也注释掉(即连接本行与下一行)!解决办法:避免注释行末尾出现\(除非故意的)总结:不得不承认有时不屑一顾的小基础能够在偶然的时候把自己

  4. 【Java牛客&力扣刷题特辑第五期】——诸佬们这些坑你们都踩过了吗?牛客网经典笔试题目每天刷两道,快乐充实一整天 - 2

    ✨✨【Java牛客&力扣刷题特辑第五期】——诸佬们这些坑你们都踩过了吗?✔✨前言🎉🎉大家好!好久不见我是青花瓷,今天你刷题了吗?文章目录,从易到难,层层递进,如果每一道题都吃透,你一定会在做题方面有质的飞跃,关注我,一起学习算法,一起分享好的题型。博主将持续更新算法,大厂笔试题,经典算法题,易错题,如果觉得不错,点点赞支持一下,如果有错误的地方,欢迎指正✨✨下一期:算法篇之回溯算法作者介绍:🎓作者:偷偷敲代码的青花瓷✨👀作者的Gitee:代码仓库📌系列文章推荐:✨1.Java牛客&力扣刷题特辑第一期✨2.Java牛客&力扣刷题特辑第二期✨3.Java牛客&力扣刷题特辑第三期✨4.Java牛客&

  5. 【华为HCIP | 高级网络工程师】刷题日记(2) - 2

    个人名片:🐼作者简介:一名大二在校生🐻‍❄️个人主页:落798.🐼个人WeChat:落798.🕊️系列专栏:零基础学java-----重识c语言----计算机网络🐓每日一句:看淡一点在努力,你吃的苦会铺成你要的路!文章目录每日刷题30道1.如图所示是DHCP协议的运行过程,客户端从申请到获得IP地址的正确流程是哪一项?2.缺省情况下,OSPF外部路由属于以下哪一种类型?5.R1、R2、R3、R4运行OSPF,它们接口的DRPriority如图所示,假如设备同时启动,则_________被选举为DR。(请填写设备名称,例如R1)。6.以下关于IPv6重复地址检测的描述,错误的是哪一项?7.在WL

  6. 2023-2-18 刷题情况 - 2

    删列造序III题目描述给定由n个小写字母字符串组成的数组strs,其中每个字符串长度相等。选取一个删除索引序列,对于strs中的每个字符串,删除对应每个索引处的字符。比如,有strs=[“abcdef”,“uvwxyz”],删除索引序列{0,2,3},删除后为[“bef”,“vyz”]。假设,我们选择了一组删除索引answer,那么在执行删除操作之后,最终得到的数组的行中的每个元素都是按字典序排列的(即(strs[0][0]请返回answer.length的最小可能值。样例样例输入strs=[“babca”,“bbazb”]strs=[“edcba”]strs=[“ghi”,“def”,“ab

  7. 【牛客刷题】/*关于C学习过程中的经典习题剖析*/ - 2

    🥤🥤嗨嗨嗨!各位小伙伴们,我依旧是你们熟悉的那个……额,理想很远大,自己却很平凡,但一直努力的小白啦🤡。 🚈🚈那么最近呢,一直在不断更新C语言的知识点,那么大概在七月二十日左右,应该就会陆续更新java部分的知识点啦,毕竟C知识入门语言,把根基打牢,才能盖出属于自己的大楼🤟!! 🎋🎋好了,回归正题,今天要更新的就是一些我在C语言的学习过程的部分经典习题分享,还希望看完的小伙伴们一键三连,谢谢啦 🥞! 正文开始:目录一、经典垃圾代码二、虾仁猪心 三、X形图案四、获得月份天数五、逆序输出一个字符串的内容六、计算求和七、打印菱形一、经典垃圾代码🍎首先先看一个经典的例子:#includeintmain

  8. 分享一个免梯子智能的问答工具ChatGPT,刷题和学习的好帮手 - 2

    使用了这个问答工具后,感觉前后端都要被替代了,太强了。由于本人之前很想体验,但是一直难搞,最近发现了一个免梯子的,重要事情说一遍,免梯子!是我最近发现的最好用,最快的,且不要梯子的,用起来爽,界面也挺好看的,大家快玩儿玩儿。试了一下写代码,写文案……真棒。特别适合最近在刷题准备面试的小伙伴,将成为你有力的帮手,有些问题可以直接问答案。快速入口话不多说先上图详细入口查看图片一、功能介绍1、技术学习我试了一下写代码并成功实现功能呢!js用两个栈实现队列并代码注释(这是gpt给的),还给了注释constructor(){  //初始化两个空栈  this.stack1=[];  this.stack

  9. 【洛谷刷题】蓝桥杯专题突破-广度优先搜索-bfs(14) - 2

    目录写在前面:题目:P1332血色先锋队-洛谷|计算机科学教育新生态(luogu.com.cn)        题目描述:        输入格式:        输出格式:        输入样例:        输出样例:解题思路:代码:AC!!!!!!!!!!写在最后:写在前面:怎么样才能学好一个算法?我个人认为,系统性的刷题尤为重要,所以,为了学好广度优先搜索,为了用好搜索应对蓝桥杯,事不宜迟,我们即刻开始刷题!题目:P1332血色先锋队-洛谷|计算机科学教育新生态(luogu.com.cn)题目描述:输入格式:第 1 行:四个整数 n,m,a,b,表示军团矩阵有 n 行 m 列。有 

  10. leetcode刷题之背包问题(01背包) - 2

    01背包概念:有n件物品和一个最多能背重量为w的背包。第i件物品的重量是weight[i]weight[i]weight[i],得到的价值是value[i]value[i]value[i]。每件物品只能用一次,求解将哪些物品装入背包里物品价值总和最大。方法1:暴力回溯法方法2:动态规划三个物品,物品的重量分别为{1,3,4},物品的价值分别为{15,20,30};背包最大容量为4。(一)二维dp数组确定dp数组以及下标的含义:dp[i][j]dp[i][j]dp[i][j]代表从下标为[0,i]的物品中任意取,放到容量为j的背包里,价值总和最大是多少。确定递推公式不放物品i的最大价值:dp[i

随机推荐