力扣(LeetCode)题解(使用JavaScript)【3】

(1)按既定顺序创建目标数组

给你两个整数数组 nums 和 index。你需要按照以下规则创建目标数组:

目标数组 target 最初为空。
按从左到右的顺序依次读取 nums[i] 和 index[i],在 target 数组中的下标 index[i] 处插入值 nums[i] 。
重复上一步,直到在 nums 和 index 中都没有要读取的元素。
请你返回目标数组。

题目保证数字插入位置总是存在。

/**
 * @param {number[]} nums
 * @param {number[]} index
 * @return {number[]}
 */
var createTargetArray = function(nums, index) {
var a = [];
for(var i = 0;i<nums.length;i++){//对数组进行循环遍历
    a.splice(index[i],0,nums[i]);
	//向a数组中的index[]位置添加nums[i]这个数,删除0个数。
	}
return a;
};

注解:
splice() 方法向/从数组中添加/删除项目,然后返回被删除的项目。

注释:该方法会改变原始数组。所以return a得到的是被插入后的a数组,即我们要求的新数组。
语法
arrayObject.splice(index,howmany,item1,…,itemX)

参数描述
index必需整数,规定添加/删除项目的位置,使用负数可从数组结尾处规定位置。
howmany必需要删除的项目数量。如果设置为 0,则不会删除项目。
item1, …, itemX可选向数组添加的新项目。

(2)删除链表中的节点

请编写一个函数,使其可以删除某个链表中给定的(非末尾)节点,你将只被给定要求被删除的节点。

现有一个链表 – head = [4,5,1,9],它可以表示为:
4->5->1->9
示例 1:

输入: head = [4,5,1,9], node = 5
输出: [4,1,9]
解释: 给定你链表中值为 5 的第二个节点,那么在调用了你的函数之后,该链表应变为 4 -> 1 -> 9.
示例 2:

输入: head = [4,5,1,9], node = 1
输出: [4,5,9]
解释: 给定你链表中值为 1 的第三个节点,那么在调用了你的函数之后,该链表应变为 4 -> 5 -> 9.

说明:

链表至少包含两个节点。
链表中所有节点的值都是唯一的。
给定的节点为非末尾节点并且一定是链表中的一个有效节点。
不要从你的函数中返回任何结果。

/**
 * Definition for singly-linked list.
 * function ListNode(val) {
 *     this.val = val;
 *     this.next = null;
 * }
 */
/**
 * @param {ListNode} node
 * @return {void} Do not return anything, modify node in-place instead.
 */
var deleteNode = function(node) {
    node.val=node.next.val;
    node.next=node.next.next;
};

注解:
为了删除联络表中的某一个节点,实际上是删除了下一个节点。

例如[4,5,1,9]要删除的如果是5,则先让node.val=node.next.val,这时候就变成了了[4,1,1,9],再进行node.next=node.next.next的操作,等同于删除了第二个1,则最终结果就变为了[4,1,9]。

(3)访问所有点的最小时间

平面上有 n 个点,点的位置用整数坐标表示 points[i] = [xi, yi]。请你计算访问所有这些点需要的最小时间(以秒为单位)。

你可以按照下面的规则在平面上移动:

每一秒沿水平或者竖直方向移动一个单位长度,或者跨过对角线(可以看作在一秒内向水平和竖直方向各移动一个单位长度)。
必须按照数组中出现的顺序来访问这些点。

示例1:
在这里插入图片描述输入:points = [[1,1],[3,4],[-1,0]]
输出:7
解释:一条最佳的访问路径是: [1,1] -> [2,2] -> [3,3] -> [3,4] -> [2,3] -> [1,2] -> [0,1] -> [-1,0]
从 [1,1] 到 [3,4] 需要 3 秒
从 [3,4] 到 [-1,0] 需要 4 秒
一共需要 7 秒

示例 2:

输入:points = [[3,2],[-2,2]]
输出:5

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/minimum-time-visiting-all-points
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

/**
 * @param {number[][]} points
 * @return {number}
 */
var minTimeToVisitAllPoints = function(points) {

var a = 0;
for(var i = 0;i<points.length-1;i++)
{
  var x =  Math.abs(points[i][0]-points[i+1][0]);
  var y =  Math.abs(points[i][1]-points[i+1][1]);
  if(x==y)
  {a = a+x;}
  else if(x>y)
  {a = a+x;}
  else 
  {a = a+y;
  }
}
return a;
};

题解:
在这里插入图片描述
因为是切比雪夫距离,所以我们只需遍历所有相邻点,然后计算切比雪夫距离之和就可以。
确定返回值是一个数值,就需要对其进行定义。然后在循环中对于x轴和y轴的绝对值进行比较,将其中更大的加到返回值中,最终遍历完得最终结果即可。

(4)二进制链表转整数

给你一个单链表的引用结点 head。链表中每个结点的值不是 0 就是 1。已知此链表是一个整数数字的二进制表示形式。

请你返回该链表所表示数字的 十进制值 。
示例 1:
1->0->1
输入:head = [1,0,1]
输出:5
解释:二进制数 (101) 转化为十进制数 (5)
示例 2:

输入:head = [0]
输出:0
示例 3:

输入:head = [1]
输出:1
示例 4:

输入:head = [1,0,0,1,0,0,1,1,1,0,0,0,0,0,0]
输出:18880
示例 5:

输入:head = [0,0]
输出:0

提示:

链表不为空。
链表的结点总数不超过 30。
每个结点的值不是 0 就是 1。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/convert-binary-number-in-a-linked-list-to-integer
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

/**
 * Definition for singly-linked list.
 * function ListNode(val) {
 *     this.val = val;
 *     this.next = null;
 * }
 */
/**
 * @param {ListNode} head
 * @return {number}
 */
var getDecimalValue = function(head) {
    //将链表转换成字符串
    number = '';
    while(head)
    {
        number += head.val;
        head = head.next;
    }
    return parseInt(number,2);
};

题解:
先将链表转换成字符串,然后用parseInt函数将这个字符串解析成一个整数。
w3school中对parseInt函数的解释
使用及
使用的是基模式(对这个函数笔者还是一知半解)
下面引申ECMAScript中的类型转换
在这里插入图片描述

(5)拿硬币

桌上有 n 堆力扣币,每堆的数量保存在数组 coins 中。我们每次可以选择任意一堆,拿走其中的一枚或者两枚,求拿完所有力扣币的最少次数。

示例 1:

输入:[4,2,1]

输出:4

解释:第一堆力扣币最少需要拿 2 次,第二堆最少需要拿 1 次,第三堆最少需要拿 1 次,总共 4 次即可拿完。

示例 2:

输入:[2,3,10]

输出:8

限制:

1 <= n <= 4
1 <= coins[i] <= 10

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/na-ying-bi
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

/**
 * @param {number[]} coins
 * @return {number}
 */
var minCount = function(coins) {
    var n = 0;
    for(i=0;i<coins.length;i++){
        if(coins[i]%2==0)
        {
            n +=coins[i]/2; 
        }
        else
        {
            n +=Math.floor(coins[i]/2)+1; 
        }
    }
    return n;
};

题解
这次又用到了Math.floor。
在这里插入图片描述
题解
数组中的数是需要依次遍历的,而且我们返回的是一个数字,这个数字是数组中每一个值的操作次数相加,对数组中的数进行操作时,我们需要进行奇数偶数分情况讨论,在js中,如果a为奇数,a/2得到的并不一定是临近整数,所以就需要用到Math.floor函数进行取值。
(这道题一开始我做错的原因就是并没有将Math.floor函数进行使用,而是直接进行除法操作)i

后记:几天做题做的多了,渐渐喜欢上这种感觉,只是对于有些知识还是相对盲区的,即使看到别人的题解仍旧感觉做起来很吃力,还是知识储备问题。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值