算法

152 阅读2分钟

斐波那契数列

当n = 0,f(n) = 0;当n = 1, f(n) = 1;当n > 1, f(n) = f(n-1) + f(n-2)。现在要求输入一个整数n,请你输出斐波那契数列的第n项

function fibonacci(n) {
  if (n <= 0) {
    return 0;
  }
  if(n == 1) {
    return 1;
  }
  return fibonacci(n - 2) + fibonacci(n-1);
}

判断一个字符串是否为回文

function isHuiwen (str) {
    let strNew = str.split('').reverse().join('')
    if (strNew === str) {
        return true
    } else {
        return false
    }
}

数组去重

//使用filter操作数组去重
var arr2=["a",'b','c','d','c','c'];
var r=arr2.filter(function (ele,index,self) {
   return self.indexOf(ele)===index;//indexOf返回元素在数组中第一次出现的位置,如果位置不一致则是重复元素
});
console.log(r);

统计一个字符串出现最多的字母

统计和字符出现的次数
let countChar = function countChar(str){
    let ro = {};
    for(let c of str){
        if(!ro[c]){
            ro[c] = 1;
        }else{
            ro[c] ++;
        }
    }
    return ro;
}
查找出次数最多的字符
let findMaxDuplicateChar = function (str){
  let chars = countChar(str);
  let max = 0;
  let char = null;
  for(let c in chars){
    if(chars[c] > max){
      max = chars[c];
      char = c;
    }
  }
  return char;
}

解析 URL Params 为对象

let url = 'http://www.domain.com/?user=anonymous&id=123&id=456&city=%E5%8C%97%E4%BA%AC&enabled';
parseParam(url)
/* 结果
{ user: 'anonymous',
  id: [ 123, 456 ], // 重复出现的 key 要组装成数组,能被转成数字的就转成数字类型
  city: '北京', // 中文需解码
  enabled: true, // 未指定值得 key 约定为 true
}
*/

实现模板

let data={
    name:'lj',
    age:'18'
};
let str='${name}今年${age}岁了';
function render(template, data) {
    let r=template.replace(/\$\{([^}]*)\}/g,function () {
          return data[arguments[1]];
    })
    return r;
}
let a =render(str,data);
console.log(a);

字符串翻转

function reserveStr (str) {
  if (typeof str !== 'string') {
      return false
  } else {
      let strNew = str.split('').reverse().join('')
      return strNew
  }
}
let a=reserveStr("abcde");

二分查找

var find = function (arr, ele) {
    var start = 0;
    var end = arr.length - 1;

    while (end - start > 1){
        var mid =  parseInt((end + start) / 2);
        if(arr[mid] == ele){
            return true;
        } else if (arr[mid] > ele){
            end = mid - 1;
        } else {
            start = mid + 1;
        }
    }
    if(end - start == 1){
        if((arr[end] == ele) || (arr[start] == ele)){
            return true;
        }
    }
    return false;
}

var arr = [1, 3, 5, 6, 7, 9, 11]
var ele = 3
console.log(find(arr, ele))

插入排序

如果在一个有序数组中插入一个新值

const A=[2,4,7,9,13];//原数组
const x=8;//需要插入的元素
//b代表第一个大于x的数字
const b=A.find(a=>a>8)
//b===undefined 代表所有的元素都比8小
const idx=A.indexOf(b);
A.splice(idx===-1?A.length:idx,0,x);