js 空值合并操作符 ?? & 可选链操作符 ?. All In One
js 空值合并操作符 ?? & 可选链操作符 ?. All In One
nullish coalescing operator
??
js 空值合并操作符 ??
是一个逻辑操作符
,当左侧的操作数为 null
或者undefined
时,返回其右侧操作数
,否则返回左侧操作数
。
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Nullish_coalescing_operator
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Optional_chaining
optional chaining operator
?.
js 可选链操作符 ?.
允许读取位于连接对象链深处的属性的值,而不必明确验证
链中的每个引用是否有效。
?.
操作符的功能类似于 . 链式操作符
,不同之处在于,在引用为空 (nullish ) (null 或者 undefined) 的情况下不会引起错误
,该表达式短路返回值是 undefined。
与函数调用一起使用时,如果给定的函数不存在,则返回 undefined。
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Nullish_coalescing_operator
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Optional_chaining
obj = {};
{}
obj.a;
undefined
obj.a ?? 0;
0
obj.a || 0;
0
obj?.a ?? 0;
0
LeetCode 2. 两数相加
- Add Two Numbers
https://leetcode.com/problems/add-two-numbers/
https://leetcode.cn/problems/add-two-numbers/
// 2. 链表相加
function addTwoNumbers(l1: ListNode | null, l2: ListNode | null): ListNode | null {
let head;
let tail;
let carry = 0;
while (l1 || l2) {
const n1 = l1?.val ?? 0;
const n2 = l2?.val ?? 0;
// const n1 = l1?.val || 0;
// const n2 = l2?.val || 0;
// const n1 = l1 ? l1.val : 0;
// const n2 = l2 ? l2.val : 0;
const sum = n1 + n2 + carry;
if (!head) {
head = tail = new ListNode(sum % 10);
} else {
tail.next = new ListNode(sum % 10);
tail = tail.next;
}
carry = Math.floor(sum / 10);
if (l1) {
l1 = l1.next;
}
if (l2) {
l2 = l2.next;
}
}
if (carry > 0) {
tail.next = new ListNode(carry);
}
return head;
};
function addTwoNumbers(l1: ListNode | null, l2: ListNode | null): ListNode | null {
// 1. 暴力法
// 遍历链表,获取原始正数,求和
// 然后,逆序的生成一个新的链表
let nums1: number[] = [];
let nums2: number[] = [];
while(l1?.val || l1?.val === 0) {
nums1.push(l1.val);
l1 = l1.next;
}
while(l2?.val || l2?.val === 0) {
nums2.push(l2.val);
l2 = l2.next;
}
let num1 = nums1.reverse().join('');
let num2 = nums2.reverse().join('');
// let sum = parseInt(num1) + parseInt(num2);
let sum = addStrings(num1, num2);
let arr = [...`${sum}`.split('')].map(Number).reverse();
// [8, 0, 7] => [7, 0, 8]
return linkedListGenerator(arr);
};
// 字符串相加 / 大数相加
const addStrings = function(num1, num2) {
let res = '';
let temp = 0;
const arr1 = num1.split('');
const arr2 = num2.split('');
while (arr1.length || arr2.length || temp) {
// ~~ ??? bitwise not 双非位运算
temp += ~~arr1.pop() + ~~arr2.pop();
// 字符串相加,要注意先后顺序
res = (temp % 10) + res;
// 进位
temp = temp > 9 ? 1 : 0;
}
// console.log('res =', res, typeof res);
return res === "0" ? res : res.replace(/^0+/, '');
}
// 链表生成
const linkedListGenerator = (arr) => {
let head;
for (const item of arr) {
const node = new ListNode(item);
if(!head) {
head = node;
} else {
let temp = head;
// 关键:迭代 next
while(temp.next) {
temp = temp.next;
}
temp.next = node;
}
}
return head;
}
refs
©xgqfrms 2012-2020
www.cnblogs.com/xgqfrms 发布文章使用:只允许注册用户才可以访问!
原创文章,版权所有©️xgqfrms, 禁止转载 🈲️,侵权必究⚠️!
本文首发于博客园,作者:xgqfrms,原文链接:https://www.cnblogs.com/xgqfrms/p/16672972.html
未经授权禁止转载,违者必究!