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]+=val
if(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 = 0
while( l1 || l2 ){
const n1 = l1 ? l1.val : 0
const n2 = l2 ? l2.val : 0
sum = n1 + n2 + n
temp.next = new ListNode( sum % 10 )
temp = temp.next
n = parseInt( sum / 10 )
if(l1) l1 = l1.next
if(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;
};