刷剑指offer 3

125 阅读1分钟

1.剑指 Offer 17. 打印从1到最大的n位数

直接计算10^n就行

var printNumbers = function(n) {
    let res = []
    for(let i=1;i<Math.pow(10,n);i++) {
        res.push(i)
    }
    return res
};

2.剑指 Offer 18. 删除链表的节点

一般为了减少头结点带来的麻烦,先建一个空的头结点,然后进行遍历,遇到val就把该节点删除

var deleteNode = function(head, val) {
    let pre = new ListNode(-1)
    pre.next = head
    let temp = pre
    while(pre.next) {
        if(pre.next.val === val) {
            pre.next = pre.next.next
            break
        } else{
        pre = pre.next
        }
    }
    return temp.next
};

3.剑指 Offer 19. 正则表达式匹配

这道题目前还有些问题,之后配合写正则表达式博客时一起写

4.剑指 Offer 21. 调整数组顺序使奇数位于偶数前面

双指针,左边一个右边一个,左边只指向奇数,右边只指向偶数,如果有遇到不符合的,就把两指针的值互换

var exchange = function(nums) {
    let left = 0
    let right = nums.length-1
    while(right>left) {
        if(nums[left]%2 !== 0) {
            left++
            continue
        }
        if(nums[right]%2 === 0) {
            right--
            continue
        }
        [nums[left], nums[right]] = [nums[right], nums[left]]

    }
    return nums
};

5.剑指 Offer 22. 链表中倒数第k个节点

第一次先遍历看链表中共有多少节点,然后再遍历一次,把倒数第k个节点删除

var getKthFromEnd = function(head, k) {
    if(!head) return null
    let cnt = 1
    let temp = head
    while(temp.next) {
        temp = temp.next
        cnt++
    }
    temp = head
    for(let i = 0; i<cnt-k;i++) {
        temp = temp.next
    }
    return temp
};

6.剑指 Offer 24. 反转链表

反转链表已经很熟悉了,建立一个空节点pre,当前节点设为cur,为了保留下一个节点,next=cur.next 之后每次把链表指向pre就行

var reverseList = function(head) {
    let prev = null
    let cur =head
    while(cur) {
        let next = cur.next
        cur.next = prev
        prev = cur
        cur = next
    }
    return prev
};