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));