栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

LeetCode刷题日记第二天

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

LeetCode刷题日记第二天

1、
主站第二题
给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。
请你将两个数相加,并以相同形式返回一个表示和的链表。你可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例 3:
输入:l1 = [9,9,9,9,9,9,9], l2 = [9,9,9,9]
输出:[8,9,9,9,0,0,0,1]


class Solution
{
public:
    ListNode* addTwoNumbers(ListNode* l1, ListNode* l2)
    {
        ListNode * head=l1;
        //首先定义一个头结点,便于最后返回结果
        int flag=0;//flag用于判断是否有进位
        while(l1->next!=nullptr&&l2->next!=nullptr)
        //循环直到l1或l2中一个的next是空结点,为什么是判断下一个呢?
        //因为如果是l1!=nullptr&&l2!=nullptr,那么如果l1是空,那么l1后面就没办法接下一个结点了(如果有的话)
        {
            if(l1->val+l2->val+flag<10)
            {
                l1->val=l1->val+l2->val+flag;
                flag=0;
            }
            else
            {
                l1->val=l1->val+l2->val+flag-10;
                flag=1;//注意修改flag的值
            }
            l1=l1->next;
            l2=l2->next;
        }
        //现在已经出循环了,但l1->val和l2->val的值还没有累加,所以单独进行一步
        if(l1->val+l2->val+flag<10)
        {
            l1->val=l1->val+l2->val+flag;
            flag=0;
        }
        else
        {
            l1->val=l1->val+l2->val+flag-10;
            flag=1;
        }
        if(l1->next==nullptr&&l2->next==nullptr)
        //这步用于判断,是不是l1,l2后面都没有结点了,如果是的话,那l1和l2的长度就是一样的,就是比较简单的一种情况了
        {
        	//注意可能还会有进位,就像9+8=17一样,一位数加一位数的结果是两位数,有位数的变化,所有要判断
            if(flag==1)
            {
                l1->next=new ListNode(1);
            }
        }
        else
        //l1或l2有一个后面还有结点
        {
            if(l1->next==nullptr)
            {
            	//把l2的后半部分接到l1后面,因为我们主要运算都是在l1上进行的
                l1->next=l2->next;
                l1=l1->next;//就是这句没写,害的我的de了好久的bug
                while(l1->next!=nullptr)
                {
                    if(l1->val+flag<10)
                    {
                        l1->val=l1->val+flag;
                        flag=0;
                    }
                    else
                    {
                        l1->val=l1->val+flag-10;
                        flag=1;
                    }
                    l1=l1->next;
                }
            }
            else
            {
                l1=l1->next;
                while(l1->next!=nullptr)
                {
                    if(l1->val+flag<10)
                    {
                        l1->val=l1->val+flag;
                        flag=0;
                    }
                    else
                    {
                        l1->val=l1->val+flag-10;
                        flag=1;
                    }
                    l1=l1->next;

                }
            }
            if(l1->val+flag<10)
            {
                l1->val=l1->val+flag;
                flag=0;
            }
            else
            {
                l1->val=l1->val+flag-10;
                flag=1;
            }
            if(flag==1)
            {
                l1->next=new ListNode(1);
            }
        }
         return head;
    }
};


一步一步debug,一个bug,de了好久,终于解出来了,开心啊!>-<



2、
剑指offer 58 II
字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。比如,输入字符串"abcdefg"和数字2,该函数将返回左旋转两位得到的结果"cdefgab"。

//法一
class Solution {
public:
    string reverseLeftWords(string s, int n) {
        return s.substr(n,s.length()-n)+s.substr(0,n);
    }
};

//法二
//官方有一种算法,觉得很强
class Solution {
public:
    string reverseLeftWords(string s, int n) {
        string res="";
        for(int i=n;i 


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/289659.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号