Z字反转
/*** @param {string} s* @param {number} numRows* @return {string}*/var convert = function(s, numRows) {if(numRows===1)return s;const len=Math.min(s.length,numRows);var rows = new Array(len).fill('')var isDown = false;var nowRow = 0// for(let item of s){// rows[nowRow] +=item;// if(nowRow===0||nowRow===len-1){// isDown=!isDown;// }// nowRow +=isDown?1:-1// }rows.forEach.call(s,val=>{rows[nowRow]+=valif(nowRow===numRows-1){isDown = false} else if(nowRow===0){isDown = true}nowRow+=isDown?1:-1})return rows.join('');};
1. 编程题:使用正则表达式提取URL中参数示例: age 和 name 的值,URL: https://www.taobao.com?name=xiaoming&age=12#years答题格式var getQuery = function(url, name) {// return url.replace(new RegExp('some regexp'), '$1')let reg=new RegExp("(?:^|&|\\?)"+name+"=([^&]*)(?:&|$)","i");return url.match(reg)?.[1];};var getQuery2 = function(url, name) {//'https://www.taobao.com?name=xiaoming&age=1'//没有参数的情况下let reg=new RegExp("\\w*\\:\\/\\/\\w*\\.\\w*\\.\\w*\\?\\S*"+name+"=([^&]*)(?:&[^&]*|$)");if(!url.match(reg))return '';return url.replace(reg, '$1')};2. 编程题:给定一个字符串,请你找出其中不含有重复字符的最长子串的长度。示例1:输入:”abcabcbb”输出:3解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。示例 2:输入:”bbbbb”输出: 1解释: 因为无重复字符的最长子串是 “b”,所以其长度为 1。输入: "pwwkew"输出: 3解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。答题格式var lengthOfLongestSubstr = function(s) {let index=0,maxLength=0;for(let i=0,j=0;j<s.length;j++){index=s.substring(i,j).indexOf(s[j]);if(index!==-1){i =i+index+1;·}maxLength=Math.max(maxLength,j-i+1);}return maxLength;};3. 编程题:给定一个只包括 ‘(‘,’)’,’{‘,’}’,’[‘,’]’ 的字符串,判断字符串是否有效。有效字符串需满足:左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。注意空字符串可被认为是有效字符串。示例 1:输入: "()"输出: true示例 2:输入: "()[]{}"输出: true示例 3:输入: "(]"输出: false示例 4:输入: "([)]"输出: false示例 5:输入: "{[]}"输出: true答题格式var isValid = function(s) {let map=new Map();map.set('{','}');map.set('[',']');map.set('(',')');let stack=[];for(let i=0;i<s.length;i++){if(map.has(s[i])){stack.push(map.get(s[i]))}else{if(stack.pop()!==s[i]){return false;}}}//循环完栈没清空if(stack.length!==0){return false;}return true;};4. 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。要求时间复杂度为 O(n)示例:给定 nums = [2, 7, 11, 15], target = 9因为 nums[0] + nums[1] = 2 + 7 = 9所以返回 [0, 1]答题格式var twoSum = function(nums, target) {let current=0;while(current<nums.length){let poor=target-nums[current];if(nums.lastIndexOf(poor)>current){return [current,nums.lastIndexOf(poor)];}current++;}};//合并有序数组function mergeArr(left=[],right=[]){let result=[];while(left.length&&right.length){result.push(left[0]<=right[0]?left.shift():right.shift());}return result.concat(left,right);}// [2,0,2,1,1,0] 排序成 [0,0,1,1,2,2]var sortColors = function (nums) {let left = -1;let right = nums.length;let i = 0;while (i < right) {if (nums[i] === 0) {swap(nums, i++, left);} else if (nums[i] === 1) {i++;} else {swap(nums, i++, --right)}}}//两数相加var addTwoNumbers = function(l1, l2) {let node = new ListNode('head')let temp = node , sum , n = 0while( l1 || l2 ){const n1 = l1 ? l1.val : 0const n2 = l2 ? l2.val : 0sum = n1 + n2 + ntemp.next = new ListNode( sum % 10 )temp = temp.nextn = parseInt( sum / 10 )if(l1) l1 = l1.nextif(l2) l2 = l2.next}if( n > 0 ) temp.next = new ListNode(n)return node.next}//斐波那契数列function fib(n){if(n<2&&n>=0)return n;return fib(n-1)+fib(n-2)}function fib2(n){let array=new Array(n+1).fill(null);array[0]=0;array[1]=1;for(let i=2;i<=n;i++){array[i]=array[i-1]+array[i-2];}return array[n]}//两数组交集function contextArray(...args){let [min,max]=args[0];for(let i=0;i<args.length;i++){let [nextmin,nextmax]=args[i];min=Math.max(min,nextmin);max=Math.min(max,nextmax)}return [min,max];}
三数之和
var threeSum = function(nums) {let ans = [];const len = nums.length;if(nums == null || len < 3) return ans;nums.sort((a, b) => a - b); // 排序for(let i=0;i<len;i++){if(nums[i]>0)break;if(i>0&&nums[i]==nums[i-1])continue;let L=i+1,R=len-1;while(L<R){const sum=nums[i]+nums[L]+nums[R];if(sum===0){ans.push([nums[i],nums[L],nums[R]]);while(nums[L]===nums[L+1])L++;while(nums[R]===nums[R-1])R--;L++;R--;}else if(sum>0)R--;else if(sum<0)L++;}}return ans;};
