反转字符串
function reverseStr(str) {
return str === "" ? "" : (reverseStr(str.substring(1)) + str.charAt(0))
}
reverseStr("hello")
计算整数的阶乘
5! = 1*2*3*4*5 = 120
function jieCheng(num){
return num <= 1 ? 1 : num * jieCheng(num-1)
}
jieCheng(5)
获取数组中的最大值
Math.max.apply(null,[1,3,4,56])
实现endsWith()
function confirmEnd(str,target) {
return str.substring(str.length - target.length) === target;
}
confirmEnd("hello","lle")
二分查找
function binarySearch(arr,left,right,findVal) {
if (left > right) {
return -1;
}
let mid = Math.floor((left + right) / 2);
let midVal = arr[mid];
if(findVal > midVal) {
// 向右递归
return binarySearch(arr,mid+1,right,findVal);
}else if (findVal < midVal) {
// 向左递归
return binarySearch(arr,left,mid-1,findVal);
}else {
return mid;
}
}
数组扁平化去重
let arr = [[1,3,2,3],[2,4,9,2,1]];
[...new Set(arr.flat().sort((a,b)=>a-b))]
打印1-1000之间的对称数
[...Array(10000).keys()].filter((x) => {
return x.toString().length > 1 && x === Number(x.toString().split('').reverse().join(''))
})
将所有 0 移动到数组的末尾
示例:
输入: [0,1,0,3,12]
输出: [1,3,12,0,0]
说明:
- 必须在原数组上操作,不能拷贝额外的数组。
- 尽量减少操作次数
function zeroMove(array) {
let len = array.length;
let j = 0;
for(let i=0;i<len-j;i++){
if(array[i]===0){
array.push(0);
array.splice(i,1);
i --;
j ++;
}
}
return array;
}
柯里化
function add(){
let args = [...arguments];
let addfun = function(){
args.push(...arguments);
return addfun;
}
addfun.toString = function(){
return args.reduce((a,b)=>{
return a + b;
});
}
return addfun;
}
全排列
function fullArrange(str) {
let result = [];
if(str.length > 1) {
for(let i=0;i<str.length;i++){
let cur = str[i];
let other = str.slice(0,i) + str.slice(i+1,str.length);
let preResult = fullArrange(other);
for(let item of preResult) {
result.push(cur + item);
}
}
}else if(str.length === 1){
result.push(str);
}
return result;
}
fullArrange("abcd")
求两个字符串的最长公共子串
比如:str=acbcbcef,str2=abcbced,则str和str2的最长公共子串为bcbce,最长公共子串长度为5。
解析: 将两个字符串转换为一个二维数组
function getMaxLength(str1,str2){
let arr = new Array(str1.length);
let max = 0;
for(let i = 0;i < str1.length; i++) {
let temp = [];
for(let j = 0;j < str2.length; j++) {
if(str1.charAt(i) === str2.charAt(j)) {
// 如果两个字符相等,则在上一个对角线的基础上加1
if(i > 1 && j > 1) {
max = arr[i-1][j-1] + 1;
temp.push(max);
}else {
temp.push(1);
}
}else {
temp.push(0);
}
}
arr[i] = temp;
}
return max;
}
getMaxLength("acbcbcef","abcbced")
斐波拉契数列
0,1,1,2,3,5,8,13,21,34,55,......
递归
function fibo (n) {
if (n <= 0) return 0;
if (n === 1) return 1;
return fibo(n - 1) + fibo(n - 2);
}
缺点:如果N足够大, 递归树就会非常庞大,响应会特别慢
动态规划
function fibo (n) {
if (n <= 0) return 0;
if (n <= 1) return 1;
var res, a = 0, b = 1;
for (var i = 2; i <= n; i++) {
res = a + b;
a = b;
b = res;
}
return res;
}
无重复字符的最长子串
给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。
输入: s = "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
var lengthOfLongestSubstring = function(s) {
let obj = []; // 用于存储子串
let max = 0;
for(let i=0;i<s.length;i++) {
let index = obj.indexOf(s[i]);
if(index < 0) {
// 当前字符不在obj里面则继续添加
obj.push(s[i];
max = Math.max(max, obj.length);
}else {
// 在,取当前子串的长度与Max比对
max = Math.max(max, obj.length);
obj.splice(0,index+1);
obj.push(s[i])
}
}
return max;
};