有效的括号
给定一个只包括 ’(’,’)’,’{’,’}’,’[’,’]’ 的字符串 s ,判断字符串是否有效。
1const isValid = function (s) {2 if (s.length % 2 === 1) {3 return false;4 }5 const regObj = {6 "{": "}",7 "(": ")",8 "[": "]",9 };10 let stack = [];11 for (let i = 0; i < s.length; i++) {12 if (s[i] === "{" || s[i] === "(" || s[i] === "[") {13 stack.push(s[i]);14 } else {15 const cur = stack.pop();16 if (s[i] !== regObj[cur]) {17 return false;18 }19 }20 }2122 if (stack.length) {23 return false;24 }2526 return true;27};
公共前缀
编写一个函数来查找字符串数组中的最长公共前缀。 如果不存在公共前缀,返回空字符串 ""。
示例 1:
输入:strs = [“flower”,“flow”,“flight”] 输出:“fl”
示例 2:
输入:strs = [“dog”,“racecar”,“car”] 输出:"" 解释:输入不存在公共前缀。
1const longestCommonPrefix = function (strs) {2 const str = strs[0];3 let index = 0;4 while (index < str.length) {5 const strCur = str.slice(0, index + 1);6 for (let i = 0; i < strs.length; i++) {7 if (!strs[i] || !strs[i].startsWith(strCur)) {8 return str.slice(0, index);9 }10 }11 index++;12 }13 return str;14};
无重复子串
给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。
示例 1:
输入: s = “abcabcbb” 输出: 3 解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。
示例 2:
输入: s = “bbbbb” 输出: 1 解释: 因为无重复字符的最长子串是 “b”,所以其长度为 1。
示例 3:
输入: s = “pwwkew” 输出: 3 解释: 因为无重复字符的最长子串是 “wke”,所以其长度为 3。 请注意,你的答案必须是 子串 的长度,“pwke” 是一个子序列,不是子串。
示例 4:
输入: s = "" 输出: 0
1const lengthOfLongestSubstring = function (s) {2 if (s.length === 0) {3 return 0;4 }56 let left = 0;7 let right = 1;8 let max = 0;9 while (right <= s.length) {10 let lr = s.slice(left, right);11 const index = lr.indexOf(s[right]);1213 if (index > -1) {14 left = index + left + 1;15 } else {16 lr = s.slice(left, right + 1);17 max = Math.max(max, lr.length);18 }19 right++;20 }21 return max;22};
在制定数据源里面生成一个长度为 n 的不重复随机数组
1function getTenNum(testArray, n) {2 const cloneArr = [...testArray];3 let result = [];4 for (let i = 0; i < n; ++i) {5 const random = Math.floor(Math.random() * cloneArr.length);6 const cur = cloneArr[random];7 result.push(cur);8 cloneArr.splice(random, 1);9 }10 return result;11}12const testArray = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14];13const resArr = getTenNum(testArray, 14);
全排列
1/**2 * @param {number[]} nums3 * @return {number[][]}4 */5const permute = nums => {6 if (!nums) return [];7 const res = [];8 // path是组合的数组9 const backtrack = path => {10 if (path.length === nums.length) {11 // 长度满足条件,推入res数组12 res.push(path);13 return;14 }15 nums.forEach(n => {16 // path中已经有n,放弃此轮17 if (path.includes(n)) return;18 // 将n加入path继续找19 backtrack([...path, n]);20 });21 };22 // 从空数组开始23 backtrack([]);24 return res;25};
判断是否环形链表
1const hasCycle = function(head) {2 if(head === null || head.next === null) {3 return false;4 }5 let slow = head;6 let fast = head.next;7 while (slow) {8 if(slow === fast) {9 return true10 }11 slow = slow?.next || null;12 fast = fast?.next?.next || null;13 }14 return false;15};
区间调度
1// 有许多[start, end]的闭区间, 请设计一个算法, 算出这些区间中, 最多有几个互不相交的区间。2// 比如intvs = [[1,3], [2,4], [3,6]]3// 这些区间最多有两个区间互不相交, 即 [1,3], [3,6], intervalSchedule函数此时应该返回245function intervalSchedule(intvs) {6 if (intvs.length === 0) {7 return 0;8 }910 const sortArray = intvs.sort((a, b) => a[1] - b[1]);1112 let count = 1; // 最少有一个区间不相交13 let xEnd = sortArray[0][1];1415 for (let item of intvs) {16 const start = item[0];17 // 这里是> 或者 >=取决于, [1,3][3,6], 3算不算相交18 if (start >= xEnd) {19 count++;20 xEnd = item[1];21 }22 }23 return count;24}2526console.log(intervalSchedule([27 [1, 3],28 [2, 4],29 [3, 6]30]))