当前位置: 代码迷 >> 综合 >> js解leetcode(47)-简单
  详细解决方案

js解leetcode(47)-简单

热度:78   发布时间:2024-03-09 01:23:09.0

1.用栈操作构建数组

题目:

给你一个目标数组 target 和一个整数 n。每次迭代,需要从  list = {1,2,3..., n} 中依序读取一个数字。

请使用下述操作来构建目标数组 target :

Push:从 list 中读取一个新元素, 并将其推入数组中。
Pop:删除数组中的最后一个元素。
如果目标数组构建完成,就停止读取更多元素。
题目数据保证目标数组严格递增,并且只包含 1 到 n 之间的数字。

请返回构建目标数组所用的操作序列。

题目数据保证答案是唯一的。

思路:从数字1开始遍历,同时用一个变量记录target的下标,每一次先执行一次push操作,然后比较当前的index和当前的值的关系。如果index=item,则直接到下一次循环,记得target右移;如果不相等,说明删掉了一个数字,target不动,推入一次pop

/*** @param {number[]} target* @param {number} n* @return {string[]}*/
var buildArray = function(target, n) {const res = [];let index = 0;const l = target.length;for (let i = 1; i <= n && index < l; i++) {res.push("Push");if (target[index] !== i) {res.push("Pop");} else {index++;}}return res;
};

2.连续字符

题目:

给你一个字符串 s ,字符串的「能量」定义为:只包含一种字符的最长非空子字符串的长度。

请你返回字符串的能量。

思路:指针

/*** @param {string} s* @return {number}*/
var maxPower = function(s) {let max = 1;const l = s.length;let left = 0;for (let i = 1; i < l; i++) {while (s[i] == s[i - 1] && i < l) {i++;}max = Math.max(max, i - left);left = i;}return max;
};

3.在既定时间做作业的学生人数

题目:

给你两个整数数组 startTime(开始时间)和 endTime(结束时间),并指定一个整数 queryTime 作为查询时间。

已知,第 i 名学生在 startTime[i] 时开始写作业并于 endTime[i] 时完成作业。

请返回在查询时间 queryTime 时正在做作业的学生人数。形式上,返回能够使 queryTime 处于区间 [startTime[i], endTime[i]](含)的学生人数。

思路:遍历比较

/*** @param {number[]} startTime* @param {number[]} endTime* @param {number} queryTime* @return {number}*/
var busyStudent = function(startTime, endTime, queryTime) {let count = 0;const l = startTime.length;for (let i = 0; i < l; i++) {if (startTime[i] <= queryTime && endTime[i] >= queryTime) count++;}return count;
};

/*** @param {number[]} startTime* @param {number[]} endTime* @param {number} queryTime* @return {number}*/
var busyStudent = function(startTime, endTime, queryTime) {return startTime.filter((item, index) => {return item <= queryTime && endTime[index] >= queryTime;}).length;
};

4.检查单词是否为其他单词的前缀

题目:

给你一个字符串 sentence 作为句子并指定检索词为 searchWord ,其中句子由若干用 单个空格 分隔的单词组成。

请你检查检索词 searchWord 是否为句子 sentence 中任意单词的前缀。

如果 searchWord 是某一个单词的前缀,则返回句子 sentence 中该单词所对应的下标(下标从 1 开始)。
如果 searchWord 是多个单词的前缀,则返回匹配的第一个单词的下标(最小下标)。
如果 searchWord 不是任何单词的前缀,则返回 -1 。
字符串 S 的 「前缀」是 S 的任何前导连续子字符串。

思路:分割为单词,然后用字符串的startsWith方法判断

/*** @param {string} sentence* @param {string} searchWord* @return {number}*/
var isPrefixOfWord = function(sentence, searchWord) {const words = sentence.split(" ");const index = words.findIndex((item) => {return item.startsWith(searchWord);});return index < 0 ? index : index + 1;
};

5.通过翻转子数组使两个数组相等

题目:

给你两个长度相同的整数数组 target 和 arr 。

每一步中,你可以选择 arr 的任意 非空子数组 并将它翻转。你可以执行此过程任意次。

如果你能让 arr 变得与 target 相同,返回 True;否则,返回 False 。

思路:因为可以选择任意子数组翻转,所以数组可以以任意顺序排列,所以只需要比较每个成员是否相等即可。排序比较

/*** @param {number[]} target* @param {number[]} arr* @return {boolean}*/
var canBeEqual = function(target, arr) {target.sort((a, b) => a - b);arr.sort((a, b) => a - b);const l = target.length;for (let i = 0; i < l; i++) {if (target[i] !== arr[i]) return false;}return true;
};