C++艰难刷题之路

#刷题前言
眼瞅着还有一年半就要毕业了,对于转专业的我来说可谓是分秒必争。从众师兄师姐那里得知LeetCode,作为C++方向菜鸡中的战斗鸡,要开始自己的奋斗之路了!本篇以及今后大部分文章都会写我刷题的思路及结果,还有我看到一些大牛的想法做法,发出来的文章没有别的目的,就是为了各位高人批评指正,帮助小弟快速成长为一名能为社会做贡献,能为家庭担责任的程序员,这里先对大家的帮助和意见表示由衷感谢!

#两道较为简单的题
##1.两数之和
具体题目是这样的:
给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。
例如:nums[1,2,5,6,8,11] target=9 ,则需要返回下标[0,4] ,即1+8=9;
思路:要区别于通过两个for循环直接刚,通过散列表将数组中的每一个元素映射到表中,通过每一个值对应的索引来取,降低了时间复杂度。
对于数组中第i个元素,只要target-nums[i]的结果在散列表中没有出现过,就把该nums[i]存到散列表中,并用i作为映射的值,直到通过hash.find()找到对应的数值,就返回结果。如果一直找不到,那么就返回{-1,-1};

//主要代码,有参考评论和解析
class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
       unordered_map<int, int> hash;//通过哈希表来对应数组中的值和索引
       for(int i = 0; i < nums.size(); i++){
        	if(hash.find(target - nums[i])!=hash.end() ) 
                return {hash[target-nums[i]],i};
            hash[nums[i] ]=i;//将数组中第i个元素的值映射到哈希表中
		}
        return {-1, -1}; 
    }
};
//使用了多组测试用例:
//第一组:nums[2,3,7,11] target=9
//第二组:nums[3,3,2,4,7] target=6
//第三组:nums[3,2,4]  target=6
//以上三组测试用例结果均正确

通过LeetCode测试,结果为:
在这里插入图片描述
测试用时还说的过去,但是内存消耗貌似过大,希望各位大佬予以指导!

##2.两数相加
题目内容:
给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807

思路:
保存结果数据的链表要自己构造出来,涉及到链表等数据结构的相关知识;
题目中,链表的头结点是对应整数的个位,第二个结点则是十位,以此类推,是反过来的,那么就方便了每一位加和时进位的问题。具体的思路我已通过注释标注在代码中。

//主要代码
class Solution {
public:
    ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
        ListNode* dummyHead = new ListNode(0);//保存结果的链表
        ListNode* p = l1, *q = l2, *curr = dummyHead/*移动变量*/;
        int carry = 0;//十进制进位标记,0为不进位\1为进位
        while (p != NULL || q != NULL) {//l1和l2都不为空时,才将对应的位相加
            int x = (p != NULL) ? p->val : 0;
            int y = (q != NULL) ? q->val : 0;
            int sum = carry + x + y;//临时变量,保存某一位上数字的加和
            carry = sum / 10;
            curr->next = new ListNode(sum % 10);//将进位后的数字放置在对应结点上
            curr = curr->next;//移动结点指向当前位置
            if (p != NULL) p = p->next;
            if (q != NULL) q = q->next;
        }
        if (carry > 0) {//如果加到最高位,进位标记还为1,说明最高位需要再向更高位位进一
            curr->next = new ListNode(carry);
            curr = curr->next;
        }
        curr=NULL;
        return dummyHead->next;//返回结果链表的头结点
    }   
};

通过LeetCode测试,得到以下结果:
在这里插入图片描述
同样,执行时间还能看,但是内存消耗过大。

#今日总结
在做题的过程中,明白自己还有很多知识掌握不牢固,不得不翻来翻去的找。感谢Nick大佬和陈乐乐大佬的精彩解答,明日继续!
我是菜鸟一只,有什么错的大佬们别喷我!谢谢。

链接:https://leetcode-cn.com/problems/add-two-numbers

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值