当前位置: 代码迷 >> 综合 >> leetcode刷题记录(40)-简单
  详细解决方案

leetcode刷题记录(40)-简单

热度:78   发布时间:2024-02-27 05:08:17.0

1.访问所有点的最小时间

题目:

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

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

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

思路:因为左移、右移、对角线移动都是耗时1,所以计算两个点之间的x、y方向的距离累加即可

/*** @param {number[][]} points* @return {number}*/
var minTimeToVisitAllPoints = function(points) {let v = 0;const l = points.length;if (l < 2) return v;for (let i = 1; i < l; i++) {let x = Math.abs(points[i][0] - points[i - 1][0]);let y = Math.abs(points[i][1] - points[i - 1][1]);const temp = Math.min(x, y) + Math.abs(x - y);v += temp;}return v;
};

2.找出井字棋的获胜者

题目:

A 和 B 在一个 3 x 3 的网格上玩井字棋。

井字棋游戏的规则如下:

玩家轮流将棋子放在空方格 (" ") 上。
第一个玩家 A 总是用 "X" 作为棋子,而第二个玩家 B 总是用 "O" 作为棋子。
"X" 和 "O" 只能放在空方格中,而不能放在已经被占用的方格上。
只要有 3 个相同的(非空)棋子排成一条直线(行、列、对角线)时,游戏结束。
如果所有方块都放满棋子(不为空),游戏也会结束。
游戏结束后,棋子无法再进行任何移动。
给你一个数组 moves,其中每个元素是大小为 2 的另一个数组(元素分别对应网格的行和列),它按照 A 和 B 的行动顺序(先 A 后 B)记录了两人各自的棋子位置。

如果游戏存在获胜者(A 或 B),就返回该游戏的获胜者;如果游戏以平局结束,则返回 "Draw";如果仍会有行动(游戏未结束),则返回 "Pending"。

你可以假设 moves 都 有效(遵循井字棋规则),网格最初是空的,A 将先行动。

思路:因为是3×3的棋盘,可以枚举所有可能。判断有人的棋子满足某一个条件即可

/*** @param {number[][]} moves* @return {string}*/
var tictactoe = function(moves) {const cases = [[0, 1, 2], [3, 4, 5], [6, 7, 8], [0, 3, 6], [1, 4, 7], [2, 5, 8], [0, 4, 8], [2, 4, 6]];let grid = new Array(9)for (let i = 0; i < moves.length; i++) {let [x, y] = moves[i]let role = i % 2 ? 'B' : 'A'grid[x * 3 + y] = role}for (let caseItem of cases) { let role = grid[caseItem[0]]if (role) {if (grid[caseItem[1]] === role && grid[caseItem[2]] === role) { return role}}}return moves.length===9?"Draw":"Pending"
};

3.整数的各位积之差

题目:给你一个整数 n,请你帮忙计算并返回该整数「各位数字之积」与「各位数字之和」的差。

/*** @param {number} n* @return {number}*/
var subtractProductAndSum = function(n) {const res = [...`${n}`].map(item=>+item);return res.reduce((a, b) => a * b) - res.reduce((a, b) => a + b);
};

4.有序数组中出现次数超过25%的数字

题目:

给你一个非递减的 有序 整数数组,已知这个数组中恰好有一个整数,它的出现次数超过数组元素总数的 25%。

请你找到并返回这个整数

思路:因为是有序数组,统计连续出现的数字的次数即可

/*** @param {number[]} arr* @return {number}*/
var findSpecialInteger = function(arr) {if(arr.length <=3) return arr[0]let num = arr.length * 0.25;let num1 = 1for(let i = 0; i < arr.length - 1; i++) {arr[i] === arr[i+1] ? num1 ++ : num1 = 1if (num1 > num) {return arr[i]}}
};

5.二进制链表转整数

题目:

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

请你返回该链表所表示数字的 十进制值 。

思路:依次累加或者转换成字符串再转换成数组均可

/*** Definition for singly-linked list.* function ListNode(val) {*     this.val = val;*     this.next = null;* }*/
/*** @param {ListNode} head* @return {number}*/
var getDecimalValue = function(head) {let res = 0;while (head) {res = res * 2 + head.val;head = head.next;}return res;
};
/*** Definition for singly-linked list.* function ListNode(val) {*     this.val = val;*     this.next = null;* }*/
/*** @param {ListNode} head* @return {number}*/
var getDecimalValue = function(head) {let s = "";while (head) {s += head.val;head = head.next;}return Number.parseInt(s, 2);
};