xgqfrms™, xgqfrms® : xgqfrms's offical website of cnblogs! xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!

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. 两数相加

  1. 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, 禁止转载 🈲️,侵权必究⚠️!


posted @ 2022-09-10 09:59  xgqfrms  阅读(573)  评论(0编辑  收藏  举报