算法

1、递归

全排列:给定一个数字列表,返回其所有可能的排列。

var testArr = [1,2,3,4];
var res = [];
function digui(arr){
	let len = arr.length;
	if(len == 1){
		res.push(arr[0]);
		console.log(res);
		res.pop();
		res.pop();
		return;
	}
	for(let i = 0; i < len; i++){
		res.push(arr[i]);
		var [...tmp] = arr;
		tmp.splice(i,1);
		digui(tmp);
	}
	res.pop();
	return;
}

digui(testArr);

2、分治法

快速幂:实现 pow(x,n)

function myPow(x, n){
	if(n == 0){
		return 1;
	}
	if(x == 0){
		return 0;
	}
	if(n < 0){
		return 1 / createPow(x, -n);
	}
	else{
		return createPow(x, n);
	}
}
function createPow(x, n){
	if(n == 1){
		return x;
	}
 	var temp = myPow(x, Math.floor(n/2));
	if(n & 1){
		return (temp*temp)*x; 
	}
	else{
		return (temp*temp);
	}
}

console.log(myPow(2,-3));

3、贪心算法

分糖果:

有 N 个小孩站成一列。每个小孩有一个评级。

按照以下要求,给小孩分糖果:

  • 每个小孩至少得到一颗糖果。

  • 评级越高的小孩可以比他相邻的两个小孩得到更多的糖果。

需最少准备多少糖果?

var array = [1, 2, 2];
var candy = function(ratings) {
    let len = ratings.length;
    var arr_l = [];
    arr_l[0] = 1;
    var arr_r = [];
    arr_r[len-1] = 1;
    var res = 0;
    for(var i = 1; i < len; i++){
        if(ratings[i] > ratings[i-1]){
            arr_l[i] = arr_l[i-1]+1;
        }
        else{
            arr_l[i] = 1;
        }
    }
	console.log(arr_l);
    for(var i = len - 2; i >= 0; i--){
        if(ratings[i] > ratings[i+1]){
            arr_r[i] = arr_r[i+1]+1;
        }
        else{
            arr_r[i] = 1;
        }
    }
	console.log(arr_r);
    for(var i = 0; i < len; i++){
        res += Math.max(arr_l[i], arr_r[i]);
    }
    return res;
};
console.log(candy(array)); 

4、位运算

给定一个整型数组,除了一个元素只出现一次外,其余每个元素都出现了三次。求出那个只出现一次的数。

注意:

你的算法应该具有线性的时间复杂度。你能否不使用额外的内存来实现?

var array = [1,1,1,4,4,4,9,9,9,25];
function singleNumber(arr) {  
    let result=0; 
	n = arr.length;
    for(let i=0;i<32;i++){  
        let bit=0;  
        for(let j=0;j<n;j++){  
            bit+=(arr[j]>>i)&1;  
        }  
        result |= (bit%3)<<i;  
    }  
    return result;  
}  
console.log(singleNumber(array));

5、动态规划

骰子求和:扔 n 个骰子,向上面的数字之和为 S。给定 Given n,请列出所有可能的 S 值及其相应的概率。

function touzi(n){
	var arr = [];
	for(let j = n; j <= 6 * n; j++){
		let times = 0;
		times = calTimes(n, j);
		arr.push([j, times]);
	}
	return arr;
}
function calTimes(n, sum){
	var times = 0;
	if(n == 1){
		if(sum <= 6){
			return 1;
		}
		else{
			return 0;
		}
	}
	else{
		for(let i = 1; i <= 6; i++){
			if(sum - i > 0){
				times += calTimes(n - 1, sum - i);
			}
		}
	}
	return times;
}
console.log(touzi(2));
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值