1.数组的度
题目:
给定一个非空且只包含非负数的整数数组 nums, 数组的度的定义是指数组里任一元素出现频数的最大值。
你的任务是找到与 nums 拥有相同大小的度的最短连续子数组,返回其长度。
思路:首先,用三个map记录数据,第一个map记录每个字符出现的次数,用来记录哪个字符出现次数最多;第二个map记录每个字符的第一次出现的下标,第三个map记录每个字符最后出现的下标。然后,知道哪些字符出现次数最多之后(因为可能出现多个字符出现一样的次数),依次找到这些字符,计算这些字符的第一次出现和最后一次出现的差,即长度,记得+1.
/*** @param {number[]} nums* @return {number}*/
var findShortestSubArray = function(nums) {const l = nums.length;if (l < 2) return l;const map1 = new Map();const map2 = new Map();const map3 = new Map();let max = 0;let maxV = [];for (let i = 0; i < l; i++) {map1.set(nums[i], (map1.get(nums[i]) || 0) + 1);map2.set(nums[i], map2.get(nums[i]) === undefined ? i : map2.get(nums[i]));map3.set(nums[i], i);if (map1.get(nums[i]) > max) {max = map1.get(nums[i]);maxV = [nums[i]];} else if (map1.get(nums[i]) == max) {maxV.push(nums[i]);}}return Math.min(...maxV.map((i) => map3.get(i) - map2.get(i) + 1));
};
2.二叉搜索树中的搜索
题目:给定二叉搜索树(BST)的根节点和一个值。 你需要在BST中找到节点值等于给定值的节点。 返回以该节点为根的子树。 如果节点不存在,则返回 NULL。
思路:既然是二叉搜索树,那么就类似二分法
/*** Definition for a binary tree node.* function TreeNode(val) {* this.val = val;* this.left = this.right = null;* }*/
/*** @param {TreeNode} root* @param {number} val* @return {TreeNode}*/
var searchBST = function(root, val) {if (!root) return null;if (val === root.val) return root;if (val > root.val) {return searchBST(root.right, val);} else {return searchBST(root.left, val);}
};
3.数据流中的第K大的元素
题目:
设计一个找到数据流中第K大元素的类(class)。注意是排序后的第K大元素,不是第K个不同的元素。
你的 KthLargest 类需要一个同时接收整数 k 和整数数组nums 的构造器,它包含数据流中的初始元素。每次调用 KthLargest.add,返回当前数据流中第K大的元素。
思路:维护一个长度为K的有序数组即可,每次加入元素的时候,就按照顺序插入,然后删除最小的元素。
/*** @param {number} k* @param {number[]} nums*/
var KthLargest = function(k, nums) {this.index = k;nums.sort((a, b) => b - a);this.data = nums.slice(0, k);
};/** * @param {number} val* @return {number}*/
KthLargest.prototype.add = function(val) {for (let i = 0; i < this.index; i++) {if (val >= this.data[i]) {this.data.splice(i, 0, val);if(this.data.length>this.index){this.data.pop()}break;}}if(this.data.length<this.index){this.data.push(val)}return this.data[this.index - 1];
};/*** Your KthLargest object will be instantiated and called as such:* var obj = new KthLargest(k, nums)* var param_1 = obj.add(val)*/
4.二分查找
题目:
给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。
思路:二分查找,没啥好说的
/*** @param {number[]} nums* @param {number} target* @return {number}*/
var search = function(nums, target) {let end = nums.length - 1;let start = 0;if (nums[end] === target) return end;if (nums[start] === target) return start;while (start <= end) {const middle = ~~((start + end) / 2);if (middle === start) return -1;if (nums[middle] === target) return middle;if (nums[middle] < target) {start = middle;} else {end = middle;}}return -1;
};
5.转换成小写字母
题目:实现函数 ToLowerCase(),该函数接收一个字符串参数 str,并将该字符串中的大写字母转换成小写字母,之后返回新的字符串。
思路:也没啥好说的
/*** @param {string} str* @return {string}*/
var toLowerCase = function(str) {let res = "";for (const s of str) {const code = s.charCodeAt();if(code>=65&&code<=91) {res += String.fromCharCode(code + 32);}else{res += s;}}return res;
};
/*** @param {string} str* @return {string}*/
var toLowerCase = function(str) {
return str.toLowerCase()
};