【剑指Offer】简单部分每日五题 - Day 2

05 - 替换空格

要求:把字符串里的空格全部换成%20
题解:循环一遍即可
举一反三:多个连续空格只视为一个如何处理?①找到一个空格后向后找删除所有连续空格;②正则替换

/**
 * @param {string} s
 * @return {string}
 */
var replaceSpace = function(s) {
  let res = ''
  for (let i = 0; i < s.length; i++){
    res += (s.charAt(i)==' ' ? '%20' : s.charAt(i))
  }
  return res
};

06 - 从尾到头打印链表

要求:反着打印链表
题解:入栈,然后出栈即可

/**
 * @param {ListNode} head
 * @return {number[]}
 */
var reversePrint = function(head) {
  if (head == null) {return []}
  let stack = []
  while (head) {
    stack.push(head.val)
    head = head.next
  }
  let res = []
  while (stack.length != 0) { res.push(stack.pop()) }
  return res
};

10-I - 斐波那契数列

要求:输出Fib数列第n项模1e9+7
题解:设定迭代基础f(0)、f(1),迭代之

/**
 * @param {number} n
 * @return {number}
 */
var fib = function(n) {
  if (n == 0) return 0
  if (n == 1) return 1
  let a = 0, b = 1, c
  for (let i = 2; i <= n;i++) {
    c = a 
    a = b
    b = (c + b) % (1e9+7)
  }
  return b
};

24 - 反转链表

要求:输入链表的头节点,反转链表,输出反转后的头节点
题解:一画图就明白。主要是用r暂存原先的next以便继续操作

/**
 * @param {ListNode} head
 * @return {ListNode}
 */
var reverseList = function(head) {
  if (head == null) { return null }
  let p, q, r
  p = null, q = head
  while (q) {
    r = q.next
    q.next = p
    p = q
    q = r
  }
  return p
};

25 - 合并两个排序的链表

要求:输入两个递增的链表,合并这两个链表为一个递增链表
题解:两个指针一起走,哪个小就接哪个进去。注意①伪头结点的使用;②一个走到尾后另一个直接接后面,不用继续遍历

/**
 * @param {ListNode} l1
 * @param {ListNode} l2
 * @return {ListNode}
 */
var mergeTwoLists = function(l1, l2) {
  if (!l1 || !l2) { return l1 ? l1 : l2 }
  let res = new ListNode(-1), head = res
  while (l1 && l2) {
    if (l1.val < l2.val) {
      res.next = new ListNode(l1.val)
      res = res.next
      l1 = l1.next
    } else {
      res.next = new ListNode(l2.val)
      res = res.next
      l2 = l2.next
    }
  }
  res.next = (l1 ? l1 : l2)
  return head.next
};

猜你喜欢

转载自www.cnblogs.com/zxuuu/p/12497081.html