每日两题:两数之和 && 两数相加

·  阅读 125

「这是我参与11月更文挑战的第4天,活动详情查看:2021最后一次更文挑战

Hope is a good thing, maybe the best of things. And no good thing ever dies.

两数之和

题目

给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target  的那 两个 整数,并返回它们的数组下标。

示例 1:

输入:nums = [2,7,11,15], target = 9
输出:[0,1]
解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 
复制代码

示例 2:

输入:nums = [3,2,4], target = 6
输出:[1,2]
复制代码

示例 3:

输入:nums = [3,3], target = 6
输出:[0,1]
复制代码

解题

双重for循环加判断

循环遍历数组,通过两层遍历,再循环的内层中去判断两个值是否符合结果的需求。

var twoSum = function (nums, target) {
    let x;
    let y;
    let arr = [x, y];
    for (x = 0; x < nums.length; x++) {
       // 已经匹配过的元素,不能再次匹配
       // 内层从后一位开始查找
        for (y = x + 1; y < nums.length ; y++) {
            if (nums[x] + nums[y] == target) {
                arr[0] = x;
                arr[1] = y;
            }
        }
    }
    return arr;
};
复制代码

两数相加

题目

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

输入: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]
复制代码

解题

由于输入的两个链表都是逆序存储数字的位数的,因此两个链表中同一位置的数字可以直接相加。

我们同时遍历两个链表,逐位计算它们的和,并与当前位置的进位值相加。

var addTwoNumbers = function (l1, l2) {
    let d = new ListNode(-1);// 哨兵节点
    let p = d; //实际用来移动的是p,为什么不直接移动d?因为最后要根据这个d返回链表头
    let flag = 0; //进位
    while (l1 || l2) { //循环跳出的条件是两个链表都空了,否则有一个不空另一个对应的节点值算0
        let a = l1 && l1.val, b = l2 && l2.val;;
        l1 = l1 ? l1.next : null,l2 = l2 ? l2.next : null;//向后移动l1,l2(如果存在的话)
        let sum = (a + b + flag) % 10; //算当前结果节点的值,要记住进位flag
        flag = Math.floor((a + b + flag) / 10); //更新进位
        p.next = new ListNode(sum); //造一个新节点
        p = p.next; //开启下一轮
    }
    if (flag !== 0) p.next = new ListNode(flag); //最后如果进位还有要多新建一个节点
    return d.next; 
};

复制代码

结语

附:

如果这篇文章帮到了你,欢迎点赞👍和关注⭐️。

文章如有错误之处,希望在评论区指正🙏🙏

欢迎关注我的微信公众号,一起交流技术,微信搜索 🔍 :「 五十年以后

分类:
前端
分类:
前端
收藏成功!
已添加到「」, 点击更改