算法学习记录(五十九)

78 阅读1分钟

问:

  1. 剑指 Offer 19. 正则表达式匹配
  2. 剑指 Offer 21. 调整数组顺序使奇数位于偶数前面
  3. 剑指 Offer 22. 链表中倒数第k个节点
  4. 剑指 Offer 24. 反转链表
  5. 剑指 Offer 25. 合并两个排序的链表 解:
const isMatch = function(str1, str2) {
    if (!str1.length) {
        if (str2.length % 2 === 1) return false
        for (let i = 1; i < str2.length; i += 2) {
            if (str2[i] !== '*') return false
        }
         return true
    }
    const dp = initDp()
    for (let i = str1.length - 1; i >= 0; i--) {
        for (let j = str2.length - 2; j >=0; j--) {
            if (str2[j + 1] !== '*') {
                dp[i][j] = (str2[j] === str1[i] || str2[j] === '.') && dp[i + 1][j + 1]
            } else {
                let si = i
                while (si !== str1.length && (str2[j] === str1[si] || str2[j] === '.')) {
                    if (dp[si][j + 2]) {
                        dp[i][j] = true
                        break
                    }
                    si++
                }
                if (!dp[i][j]) dp[i][j] = dp[si][j + 2]
            }
        }
    }
    return dp[0][0]
    function initDp() {
        const dp = []
        for (let i = 0; i <= str1.length; i++) {
            dp[i] = []
            for (let j = 0; j <= str2.length; j++) {
                if (j === str2.length) {
                    dp[i][j] = i === str1.length
                }
            }
        }
        dp[str1.length][str2.length -1] = false

        for (let i = str2.length - 2; i >= 0; i -= 2) {
            if (str2[i + 1] === '*') {
                dp[str1.length][i] = true
            } else {
                break
            }
        }
        for (let i  = 0; i < str2.length; i++) {
            if (dp[str1.length][i + 1] !== true) {
                dp[str1.length][i] = false
            } else {
                break
            }
        }
        for (let i = 0; i <= str1.length - 1; i++) {
            if (i === str1.length - 1) {
                dp[i][str2.length - 1] = str2[str2.length - 1] === '.' || str2[str2.length - 1] === str1[str1.length - 1]
            } else {
                dp[i][str2.length - 1] = false
            }
        }
        return dp
    }
}
const exchange = function(arr) {
    let oddIdx = -1
    let evenIdx = arr.length
    let idx = 0
    while (idx < evenIdx) {
        if (arr[idx] % 2 === 0) {
            [arr[idx], arr[evenIdx - 1]] = [arr[evenIdx - 1], arr[idx]];
            evenIdx--
        } else {
            [arr[idx], arr[oddIdx + 1]] = [arr[oddIdx + 1], arr[idx]]
            oddIdx++
            idx++
        }
    }
    return arr
};
const getKthFromEnd = function(head, k) {
    let quick = head
    let slow = head
    for (let i = 0; i < k; i++) {
        quick = quick.next
    }
    while (quick) {
        slow = slow.next
        quick = quick.next
    }
    return slow
};
const reverseList = function(head) {
    let curNode = head 
    let pre = null
    while (curNode) {
        const temp = curNode.next
        curNode.next = pre
        pre = curNode
        curNode = temp
    }
    return pre
};
const mergeTwoLists = function(l1, l2) {
    const preHead = new ListNode(0)
    let pre = preHead
    while (l1 && l2) {
        if (l1.val <= l2.val) {
            pre.next = l1
            l1 = l1.next
        } else {
            pre.next = l2
            l2 = l2.next
        }
        pre = pre.next
    }
    pre.next = l1 ?? l2
    return preHead.next
};