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 开始相交:
题目数据 保证 整个链式结构中不存在环。
注意,函数返回结果后,链表必须 保持其原始结构 。
解析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语法糖
三元运算符
翻译: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
};