12.21 LeetCode(剑指offer)

74 阅读1分钟

18. 删除链表的节点

var deleteNode = function(head, val) {
    if(!head) return head;
    let pre = head;
    if(head.val==val) return head.next;
    let tmp = null;
    while(pre.next){
        tmp = pre.next;
        if(tmp.val==val){
            pre.next = tmp.next;
        }
        pre = tmp;
        tmp = tmp.next;
    }
    return head;
};

22.链表中倒数第k个结点

//不是双指针
var getKthFromEnd = function(head, k) {
    let arr = [];
    if(!head) return head;
    while(head){
        arr.push(head);
        head = head.next;
    }
    return arr[arr.length-k];
};
//快慢指针
var getKthFromEnd = function(head, k) {
    let tmp = head;
    while(tmp){
        tmp = tmp.next;
        if(k===0){
            head = head.next;
        }
        else{
            k--;
        }
    }
    return head;
};

25. 合并两个排序的链表

var mergeTwoLists = function(l1, l2) {
    if(!l1) return l2;
    if(!l2) return l1;
    let tmp = new ListNode();
    const res = tmp;
    while(l1&&l2){
        tmp.next = new ListNode();
        tmp = tmp.next;
        if(l1.val>l2.val){
            tmp.val = l2.val;
            l2 = l2.next;
        }
        else{
            tmp.val = l1.val;
            l1 = l1.next;
        }
        
    }
    if(l1||l2) {
        tmp.next = l1?l1:l2;
    }
    else tmp.next = null;
    return res.next;
};

52.两个链表的第一个公共结点

//哈希
var getIntersectionNode = function(headA, headB) {
    if(!headA||!headB) return null;
    let set = new Set();
    while(headA){
        set.add(headA);
        headA = headA.next;
    }
    while(headB){
        if(set.has(headB)) return headB;
        headB = headB.next;
    }
    return null;
};
//双指针,将两个链表拼成一个,就可以一起遍历了,有公共结点就能拼成一个,没有就会失败返回null
var getIntersectionNode = function(headA, headB) {
    if(!headA||!headB) return null;
    let A = headA;
    let B = headB;
    while(A!=B){
        A = A?A.next:headB;
        B = B?B.next:headA;
    }
    return A;
};

21. 调整数组顺序使奇数位于偶数前面

//简单粗暴
var exchange = function(nums) {
    let res = [];
    for(let i of nums){
        if(i%2) res.unshift(i);
        else res.push(i);
    }
    return res;
};
//双指针,从左边找偶数,从右边找奇数,交换
var exchange = function(nums) {
    let left = 0;
    let right = nums.length-1;
    while(left<right){
        while(nums[left]%2==1){
        //是while不是if....
            left++;
        }
        while(nums[right]%2==0){
            right--;
        }
        if(left>=right) break;
        const tmp = nums[left];
        nums[left] = nums[right];
        nums[right] = tmp;
        left++;
        right--;
    }
    return nums;
};

58 - I. 翻转单词顺序

var reverseWords = function(s) {
    s = s.split(" ");
    let res  = [];
    for(let i of s){
        if(i==="") continue;
        else res.unshift(i);
    }
    return res.join(" ").toString();
};
//双指针
var reverseWords = function(s) {
    s = s.trim().split(/\s+/g);
    // /\s+/g将相连的空格归结为一个
    let left = 0;
    let right = s.length-1;
    while(left<right){
        if(s[left]==""){
            left++;
            continue
        }
        if(s[right]==""){
            right--;
            continue;
        }
        let tmp = s[left];
        s[left++] = s[right];
        s[right--] = tmp;
    }
    return s.join(" ").toString();
};

57. 和为s的两个数字

var twoSum = function(nums, target) {
    let left = 0;
    let right = nums.length-1;
    while(left<right){
        while(nums[right]>=target){
            right--;
        }
        if(nums[left]+nums[right]>target){
            right--;
        }
        else if(nums[left]+nums[right]<target){
            left++;
        }
        else{
            return [nums[left], nums[right]]
        }
    }
    return [];
};

48.最长不含重复字符的子字符串

var lengthOfLongestSubstring = function(s) {
    let tmp = [];
    let res = 0;
    for(let i of s){
        if(tmp.indexOf(i)!=-1){
            let start = tmp.indexOf(i)+1;
            while(start--){
                tmp.shift();
            }
        }
        tmp.push(i);
        res = Math.max(tmp.length, res);
    }
    return res;
};

46.把数字翻译成字符串

//变种的青蛙跳台问题, res=tmp+res/tmp注意
var translateNum = function(num) {
    if(num<10) return 1;
    num = num.toString().split("");
    let pre = 1;
    let tmp = num[0]+num[1]<'26'&&num[0]+num[1]>='10'?2:1;
    let res = tmp;
    for(let i =2;i<num.length;i++){
        const store = num[i-1]+num[i];
        if(store<'26'&&store>='10'){
            res = tmp + pre;
        }
        else{
            res = tmp;
        }
        pre = tmp;
        tmp = res;
    }
    return res;
};