「这是我参与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;
};
结语
附:
如果这篇文章帮到了你,欢迎点赞👍和关注⭐️。
文章如有错误之处,希望在评论区指正🙏🙏
欢迎关注我的微信公众号,一起交流技术,微信搜索 🔍 :「 五十年以后 」