js解leetcode(47)-简单

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;
};