js 常见基础算法问题

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('{[]}'));
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值