8-8 力扣热门题目

这几天力扣的总结

全部使用js语言

两数之和

题目

给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。你可以假设每种输入只会对应一个答案,并且你不能使用两次相同的元素。你可以按任意顺序返回答案。只会存在一个有效答案

解析

暴力遍历:固定一个值,从他后一个数字开始遍历,检验二者和是否为 target ,如果是,返回数组下标,不是继续遍历,直到数组最后一个数字,然后后移之前固定的数字,重复直到固定的数字是数组里倒数第二个数字。到最后不存在这样的两个数字返回空数组

js的语法糖

返回数组直接写 方括号 即可

代码

/**
 * @param {number[]} nums
 * @param {number} target
 * @return {number[]}
 */
var twoSum = function(nums, target) {
    for(let i = 0; i < nums.length - 1; i ++){
        for(let j = i + 1; j< nums.length; j++){
            if(nums[i] + nums[j] === target){
                return [i,j]
            }
        }
    }
    return []
};

移动0

题目

给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。请注意:必须在不复制数组的情况下原地对数组进行操作。

解析1:双指针法

0 后,非0 前:两个指针,从一边开始,一个指针负责遍历,另一个负责移动0,当负责遍历的指针遇见非0,就和负责移动0的指针交换,直到遍历完数组

js语法糖

交换数组里面的值,可以直接写为[arr[n],arr[m]] = [arr[n],arr[m]]

代码

/**
 * @param {number[]} nums
 * @return {void} Do not return anything, modify nums in-place instead.
 */
var moveZeroes = function(nums) {
    let left = 0;
    let right = 0;
    while(left < nums.length){
        if(nums[left]){
            [nums[left],nums[right]] = [nums[right],nums[left]]
            right ++
        }
        left ++
    }

};

解析2:暴力

从一边开始到数组最后遍历,遇见0,就从末端遍历(保证非0元素顺序不变,每一次把最前面非0元素放到最前面)遇见非0 就和最初的0值交换,直到到达最初位置

代码

/**
 * @param {number[]} nums
 * @return {void} Do not return anything, modify nums in-place instead.
 */
var moveZeroes = function(nums) {
    for(let i = 0;i < nums.length;i++){
        if(nums[i] === 0){
            for(let j = nums.length - 1 ; j > i; j--){
                if(nums[j]){
                    let tmp = nums[i]
                    nums[i] = nums[j]
                    nums[j] = tmp
                }
            }
        }
    }
};

相交链表

题目

给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回 null 。
图示两个链表在节点 c1 开始相交:
alt text
题目数据 保证 整个链式结构中不存在环。
注意,函数返回结果后,链表必须 保持其原始结构 。

解析1:创建对象,利用has()方法判断

很神奇,然后注意条件是:相交点之后的链一样,且每条链的数字互异
先把一条链放到创建的对象里(方便使用has方法,查看另一条链是否存在这个数字)(节点一样,而不是值一样:就是后面的链完全一样),再处理第二条,依次遍历,看之前创建的对象里有没有一样的,有就是相交,返回交点,反之则返回null。

js语法糖

js的面向对象:创建对象 new Set()
没有->,只有.访问
has()方法:节点是否存在于对象
返回的是节点,而不是值

代码

/**
 * Definition for singly-linked list.
 * function ListNode(val) {
 *     this.val = val;
 *     this.next = null;
 * }
 */

/**
 * @param {ListNode} headA
 * @param {ListNode} headB
 * @return {ListNode}
 */
var getIntersectionNode = function(headA, headB) {
    const visited = new Set()
    let tmp = headA
    while(tmp){
        visited.add(tmp)
        tmp = tmp.next
    }
    tmp = headB
    while(tmp){
        if(visited.has(tmp)){
            return tmp;
        }
        tmp = tmp.next
    }
    return null;
};

解析2:双指针

两个链表A,B,分别把他们接在一起 A+B,B+A,同时向前移动,如果最后有一样的数值,就找到了相交点。
最后回返任意一个(有交点就是本身,无交点就是null)

js语法糖

三元运算符
alt text
翻译:pA 是否是null,是就为headB,不是就向下遍历

代码

/**
 * Definition for singly-linked list.
 * function ListNode(val) {
 *     this.val = val;
 *     this.next = null;
 * }
 */

/**
 * @param {ListNode} headA
 * @param {ListNode} headB
 * @return {ListNode}
 */
var getIntersectionNode = function(headA, headB) {
    if(headA === null || headB === null){
        return null;
    }
    let pA = headA;
    let pB = headB
    while(pA !== pB){//这里是节点一样,而不只是值
        pA = pA === null ? headB : pA.next
        pB = pB === null ? headA : pB.next
    }
    return pA
};

反转链表

题目

posted @ 2025-08-08 17:38  GJ504b  阅读(11)  评论(0)    收藏  举报