js 常见基础算法问题
后序会继续补充
// 数组扁平化
const flatten = arr =>
[].concat(...arr.map(x => Array.isArray(x) ? flatten(x) : x));
// 节流
function throttle (func, delay = 60) {
let lock = false;
return (...arg) => {
if (lock) return;
func(...arg);
lock = true;
setTimeout(() => {lock = false}, delay);
}
}
//防抖
function boundce (func, delay = 200, timer = null) {
return (...arg) => {
clearTimeout(timer);
timer = setTimeout(() => func.bind(null)(...arg), delay);
}
}
function verification(e) {
console.log(this);
content.textContent = e.target.value;
}
demo.oninput = boundce(verification);
//柯里化
const curry = func => {
const g = (...allArgs) => allArgs.length >= func.length
? func(...allArgs) : (...args) => g(...allArgs, ...args);
return g;
}
const sum = curry(function(a,b,c,d) {
return a + b+ c+ +d;
})
//判断是否是素数
function is_prime(n) {
if (n <= 1) return false;
let prime = true;
const N = Math.floor(Math.sqrt(n));
for (let i = 2; i <= N; i++) {
if (n % i === 0) {
prime = false;
break;
}
}
return prime;
}
console.time('quick');
// 快速求出指定范围的所有素数
function allPrime(max) {
let allPrime = [];
let isPrime = true;
for (let i = 2; i <= max; i++) {
isPrime = true;
let sqrt = Math.floor(Math.sqrt(i));
for (let j = 2; j <= sqrt; j++) {
if (i % j === 0) {
isPrime = false;
break;
}
}
if (isPrime) {
allPrime.push(i);
}
}
return allPrime;
}
console.log(allPrime(100000)); // quick: 19.373046875 ms
console.timeEnd('quick');
console.time('slow');
// 穷举法求出所有素数
var prime = function(len){
var i,j;
var arr = [];
for(i = 1; i < len; i++){
for(j=2; j < i; j++){
if(i%j === 0) {
break;
}
}
if(i <= j && i !=1){
arr.push(i);
}
}
return arr;
};
console.log(prime(100000)) // slow: 1545.914794921875 ms
console.timeEnd('slow');
// 1:字符串回文判断
var str1 = 'abcdefga';
var str2 = 'abcdcba';
function plalindrome(str){
let len = str.length;
return str == str.split('').reverse().join('');
}
console.log(plalindrome(str1));//false
console.log(plalindrome(str2));
// 统计出现次数最多的字母
let str = 'aaasaassssdddfggreaa';
function mostUnit(str) {
str = str.split('');
let obj = {};
let res = [];
for(let i = 0 ; i < str.length ; i++) {
if(!obj[str[i]]) {
obj[str[i]] = 1;
}else {
obj[str[i]]++;
}
}
for(let attr in obj) {
res.push(obj[attr]);
}
return Math.max(...res);
}
console.log(mostUnit(str));
// 生成指定长度的随即字符串
function randomStr(length) {
let str = '';
for(let i = 0 ; i < length ; i++) {
str += String.fromCharCode(parseInt(Math.random() * 26) + 65);
}
return str;
}
// 遍历获取节点的所有含有指定className的元素
let resArr = [];
function getClass(node,className) {
let child = node.children;
for(let i = 0 ; i < child.length ; i++) {
if(child[i].className.indexOf(className) !== -1) {
resArr.push(child[i]);
getClass(child[i],className);
}
}
return resArr;
}
//电话号码的字母组合
const letterCombinations = digits => {
const phoneNum = [[],[],
['a','b','c'],['d','e','f'],
['g','h','i'],['j','k','l'],
['m','n','o'],['p','q','r','s'],
['t','u','v'],['w','x','y','z']
]
digits = digits.split('').map(Number);
let selectCom = digits.map(t => {
return phoneNum[t];
});
}
letterCombinations('23');
// 判断括号是否对称完整
const isValid = function (s) {
if (!s) return true
var stack = []
var paris = {
'(': ')',
'[': ']',
'{': '}'
}
var key, val, tmp
for (var i = 0, len = s.length; i < len; i++) {
key = s[i]
val = paris[key]
if (val) {
stack.push(val) // [')', ']', '}']
} else {
tmp = stack.pop()
// console.log('tmp', tmp)
// console.log('key',key)
if (tmp !== key) return false
}
}
return stack.length === 0
};
console.log(isValid('{[]}'));