我知道的前端算法

前端面试——走楼梯问题 问题描述:一个人爬楼梯,只可以一步走一层或一步走两层,共多少种走法? 输入:楼梯总层数 输出:有几种走法 解: 这个问题,是一个递归问题。 1.楼梯总层数为1,有一种走法,一步走一层。 2.楼梯总层数为2,有两种走法: 1)一步走一层,走两步 2)一步走两层,走一步 3.楼梯总层数为n的走法有多少种呢? 走到n层只有两种可能: 1)在第n-1层往上走1步(一步一层)到第n层 2)在第n-2层往上走1步(一步两层)到第n层 所以: 楼梯总层数为n的走法=楼梯总层数为n-1的走法+楼梯总层数为n-2的走法 类似 阅读详情

前端算法大致可以分为几类

  • 排序
  • 堆栈,队列,链表
  • 递归,动态规划,贪心算法 二分查找

    以上内容面试官一般都会结合数组,字符串来考察你对以上知识的掌握程度

排序神图

这些排序里边主要掌握四个就可以:冒泡、选择、插入、快速

冒泡排序算法

function bubbleSort(arr) {  
    for(let i = 0,l=arr.length;i<l-1;i++) {
        for(let j = i+1;j<l;j++) { 
          if(arr[i]>arr[j]) {
                let tem = arr[i];
                arr[i] = arr[j];
                arr[j] = tem;
            }
        }
    }
    return arr;
}

图文:冒泡排序

选择排序

function selectionSort(arr) {
    var len = arr.length;
    var minIndex, temp;
    for (var i = 0; i < len - 1; i++) {
        minIndex = i;
        for (var j = i + 1; j < len; j++) {
            if (arr[j] < arr[minIndex]) {     // 寻找最小的数
                minIndex = j;                 // 将最小数的索引保存
            }
        }
        temp = arr[i];
        arr[i] = arr[minIndex];
        arr[minIndex] = temp;
    }
    return arr;
}

图文选择排序

插入排序

function insertionSort(arr) {
    var len = arr.length;
    var preIndex, current;
    for (var i = 1; i < len; i++) {
        preIndex = i - 1;
        current = arr[i];
        while(preIndex >= 0 && arr[preIndex] > current) {
            arr[preIndex+1] = arr[preIndex];
            preIndex--;
        }
        arr[preIndex+1] = current;
    }
    return arr;
}

图文:插入排序

快速排序

function qSort(arr) {
  if (arr.length == 0) {
      return [];
  }
  var left = [];
  var right = [];
  var pivot = arr[0];
  for (var i = 1; i < arr.length; i++) { // 注意这里的起始值,因为有一个作为flag了
      if (arr[i] < pivot) {
          left.push(arr[i]);
      } else {
          right.push(arr[i]);
      }
  }
  return qSort(left).concat(pivot, qSort(right));
}

图文:快速排序

链表

单向链表的添加:

function insert(newElement, item){
    var newNode = new Node(newElement);  // 新建一个节点
    var current = this.find(item);   //找到item的位置(current在js中是引用,类似于C语言指针)
    newNode.next = current.next;  //将新节点的后继指向item的后继
    current.next = newNode;  // 修改item节点的后继指向新节点
}

单向链表的删除:

// 首先要找到删除元素的上一个节点
function findPrevious (item) {
    var currentNode = this.head;
    while (!(currentNode.next === null) && (currentNode.element !== item)) {
    return currentNode;
    }
}

function remove (item) {
    var prevNode = this.findPrevious(item);
    var currentNode = this.find(item); // 查找到当前要删除的节点
    if (!(prevNode.next === null)) {
        prevNode.next = prevNode.next.next; //待删除节点的前驱的后继 指向 原本待删除节点的后继
        currentNode.next = null; // 释放节点,防止内存泄漏
    }
}

双向列表的添加:

// 插入节点,注意插入的链指向
function insert(newElement, item){
    var newNode = new Node(newElement);  // 新建一个节点
    var current = this.find(item);   //找到item的位置
    newNode.next = current.next;  //将新节点的后继指向item的后继
        newNode.previous = current;
        current.next = newNode;
        if (newNode.next !== null) {
                newNode.next.previous = newNode; // 将item原本的位置的前驱指向新节点
        }
}

双向链表的删除:

function remove (item) {
    var currentNode = this.find(item);
    if (!(currentNode === null)) {
        currentNode.previous.next = currentNode.next; // 删除节点的前驱的后继,指向删除节点的后继
        currentNode.next.previous = currentNode.previous; //删除节点的后继的前驱,指向删除节点的前驱
        currentNode.next = null; // 释放节点,防止内存泄漏
        currentNode.previous = null;
    } else {
        currentNode.previous.next = null; // 尾节点的前驱的后继指向null
        currentNode.previous = null; // 释放尾节点
    }
}

斐波那契数列

//递归方案
function gostair(stair){
  if(stair < 2){
    return stair;
}
return gostair(stair-1) + gostair(stair -2)
}

//动态规划方案
function gostair(n){
    let arr =  [];
    for(let i =  0;  i<=n;  i++){
      arr[i]  =  0;
    }
    if(n ==  1||n==2){
         return 1;
    }else{
        arr[1]  =  1;
        arr[2]  =  2;
        for(let j =  3;j<=n;j++){
        arr[j]  =  arr[j-1]+arr[j-2];
    }
    }
    return arr[n-1];
}
//迭代方案(指针移动方案)
function  gostair(n){
    let  first =  1; 
    let  last =  1;
    let result  =  1;
    for(let i=2;i<n;i++){
        result =  first +last;
        first =  last;
        last =  result;
    }
return result;
}

数组拍平

1.arr.join(',').split(',');
2.
function flat(arr) {
var newarr = [];
return function flatten(arr) {
    for(let i =  0;i<arr.length;i++){
        if (Object.prototype.toString.call(arr[i]) === "[object Array]") {
            newarr.concat(flatten(arr[i]))
        } else {
    newarr.push(arr[i]);
        }
    }(arr)
    return newarr
}

}

二分查找(前提是排序完成,最快的查找方法)

function find (arr, item) {
    var low = 0;  //设定下标
    var high = arr.length - 1; // 设定上标
    while (high >= low) {
        var mid = Math.floor((low + high) / 2);   //二分查找的关键
        if (arr[mid] === item) {
            return mid;
        }else if (arr[mid] > item) {
             high = mid;
        } else if (arr[mid] < item){
            low = mid;
        } else {
            return mid;
        }
    }
    return  -1;
}

浅拷贝

function extendCopy(p) {
  var c = {};
  for (var i in p) { 
    c[i] = p[i];
  }
  return c;
}

深拷贝:循环调用浅拷贝

function deepCopy(p, c) {
    var c = c || {};
    for (var i in p) {
      if (typeof p[i] === 'object') {
        c[i] = (p[i].constructor === Array) ? [] : {};
        deepCopy(p[i], c[i]);
      } else {
         c[i] = p[i];
      }
    }
    return c;
  }

用代码实现二叉搜索树,写出相关方法查找最小值。
(左子树上所有结点的值均小于它的根结点的值;右子树上所有结点的值均大于它的根结点的值;
)

//定义节点
    function Node(data, left, right) {
        this.data = data;
        this.left = left;
        this.right = right;
    }

// 插入值
function insert (data) {
    var n = new Node(data, null, null); // 定义一个新节点
    if(this.root === null) {
        this.root = n;
    } else {
        var current = this.root;
        var parent;
        while (true) {
            parent = current;
            if (data < current.data) {
                current = current.left; // 比当前值小就放左边
                if (current === null) {
                    parent.left = n;
                    break;
                }
            } else {    // 比当前值大就放右边
                current = current.right;
                if(current === null){
                    parent.right = n;
                    break;
                }
            }
        }
    }
}

// 找最小值
function getSmallest (root) {
    // 一直往左子树上去找,找到没有左节点即找到了最小值
    var current = this.root || root;
    while (!(current.left === null)) {
        current = current.left;
    }
    return current;
}

函数防抖,函数节流
防抖:debounce 操作结束后等待wait才执行一次。实例:keypress查询,防止点击提交按钮时的多次点击。

function debounce(fun,wait){
    var timeout  =  null;
    return function(){
    if(timeout !=  null) clearTimeout(timeout);
        timeout  =  setTimeout(fun,wait);
    }
}

如果immediate参数如果为true,则debounce函数会在调用时立刻执行一次function,等待时间内只执行一次

function debounce(fun,wait,immediate){
    var timeout;
    return function(){
        var context =  this,args =  arguments;
        var later =  function(){
        timeout =  null;
        if(!immediate) fun.apply(context,args);//immediate为false执行,操作结束后等待wait才执行一次
        };
        var callNow =  immediate &&   !timeout;
        clearTimeout(timeout);
        timeout =  setTimeout(later,wait);
        if(callNow)  fun.apply(context,args);//immediate为true执行,操作开始立即执行,

    }
}

节流:throttle 每隔多长时间执行一次函数,与防抖相比,节流函数多了一个 mustRun 属性,代表 mustRun 毫秒内,必然会触发一次 handler 实例:滑动加载图片懒加载

function  throttle(fun,wait,mustRun){
  var timeout,startTime =  new Date();
  return function(){
    var context =  this,args =  arguments,curTime =  new Date();
    clearTimeout(timeout);
    if(curTime -  startTime >=  mustRun){
        fun.apply(context,args);//mustRun内必触发一次
        startTime =  curTime;
    }else{
        timeout =  setTimeout(fun,wait);//每个wait触发一次
    }
  }

无限分类递归树

function toTree(data) {
   // 删除 所有 children,以防止多次调用
    data.forEach(function (item) {
        delete item.children;
    });

    // 将数据存储为 以 id 为 KEY 的 map 索引数据列
    var map = {};
    data.forEach(function (item) {
        map[item.id] = item;
    });
    var val = [];
    data.forEach(function (item) {

        // 以当前遍历项,的pid,去map对象中找到索引的id
        var parent = map[item.pid];

        // 好绕啊,如果找到索引,那么说明此项不在顶级当中,那么需要把此项添加到,他对应的父级中
        if (parent) {

            (parent.children || ( parent.children = [] )).push(item);

        } else {
            //如果没有在map中找到对应的索引ID,那么直接把 当前的item添加到 val结果集中,作为顶级
            val.push(item);
        }
    });

    return val;
}

获取两个时间中的所有年月

function getYearAndMonth(start, end) {
    var result = [];
    var starts = start.split('-');
    var ends = end.split('-');
    var staYear = parseInt(starts[0]);
    var staMon = parseInt(starts[1]);
    var endYear = parseInt(ends[0]);
    var endMon = parseInt(ends[1]);
    while (staYear <= endYear) {
        if (staYear === endYear) {
            while (staMon < endMon) {
                staMon++;
                result.push({year: staYear, month: staMon});
            }
            staYear++;
        } else {
            staMon++;
            if (staMon > 12) {
                staMon = 1;
                staYear++;
            }
            result.push({year: staYear, month: staMon});
        }
    }

    return result;
}
GradNorm:Gradient Normalization for Adaptive Loss Balancing in Deep Multitask Networks,梯度归一化 文章目录引言gradnorm   gradnorm论文地址:https://arxiv.org/abs/1711.02257   gradnorm是一种优化方法,在多任务学习(Multi-Task Learning)中,解决 1. 不同任务loss梯度的量级(magnitude)不同,造成有的task在梯度反向传播中占主导地位,模型过分学习该任务而忽视其它任务;2. 不同任务收敛速度不一致;这两个... 阅读详情

相关推荐

别再被骚扰了!手把手教你彻底卸载阿里云盾(安骑士)并封禁其IP段

本文详细指导如何彻底卸载阿里云盾(安骑士)并封禁其IP段,帮助用户夺回服务器控制权。从识别监控组件到执行官方卸载脚本,再到手动清理残留文件和配置iptables规则,确保完全阻断云盾通信。适用于追求极致性能或需要完全自主控制的环境。

weixin_42525551的博客 453

前端常见算法

括冒泡排序、选择排序、插入排序、希尔排序、归并排序、快速排序 搜索算法 二分查找、广度优先搜索、深度优先搜索 动态规划算法 贪心算法 字符串算法

weixin_46061399的博客 2023

基于FSL的DTI数据预处理流程

最近在学习处理DTI数据,总结了一份应用FSL做DTI数据预处理的流程与大家交流交流。如果有错误的地方欢迎大家指正!        我用的数据是Philips的数据,如果是GE或者西门子的数据可能会有所不同。   原始数据:包括3DT1数据和高分辨率DTI数据,均是dicom格式。 工具:MRICRON和FSL,所有的命令均在Linux的终端中运行。   1.格式转换:将后缀名为dcm

zaza_zaza的博客 2万+

前端常用算法

1,时间复杂度 通常使用最差的时间复杂度来衡量一个算法的好坏。常数时间 O(1) 代表这个操作和数据量没关系,是一个固定时间的操作,比如说四则运算。对于一个算法来说,可能会计算出如下操作次数 aN + 1,N 代表数据量。那么该算法的时间复杂度就是 O(N)。因为我们在计算时间复杂度的时候,数据量通常是非常大的,这时候低阶项和常数项可以忽略不计。当然可能会出现两个算法都是 O(N) 的时间复杂度,那么对比两个算法的好坏就要通过对比低阶项和常数项了。 2,位运算 位运算在算法中很有用,速度可以比四则运算快很多

qq_42994986的博客 3632

Xilinx UltraScale+ FPGA实战:手把手教你实现USB3.0设备开发(附原理图+代码)

本文详细介绍了如何使用Xilinx UltraScale+ FPGA开发USB3.0设备,涵盖硬件设计、Vivado工程配置、Petalinux系统定制及功能测试全流程。通过实战案例和优化技巧,帮助开发者快速掌握高速数据传输实现方法,提升嵌入式系统开发效率。

weixin_29159995的博客 209

KEPServerEX中,别名映射(Alias Mapping)数据标签重命名机制

目录核心机制应用场景配置步骤技术特性与参考内容的差异KEPServerEX中,别名映射(Alias Mapping) 是一种数据标签重命名机制,主要用于简化复杂标签路径的调用或实现跨系统兼容。其核心逻辑和功能如下:路径抽象 将设备层级结构中的完整标签路径(如 Channel1.Device1.Tag1)映射为简短别名(如 TempSensor1),降低客户端调用的复杂度。动态绑定 别名与实际标签实时关联,数据更新和读写操作通过别名直接传递到底层物理标签,无需修改客户端配置。多对一映射支持多个别名指向

「东哥说MES」 专注于MES制造执行系统,为你拆解核心架构、功能模块及与ERP/PLC的集成逻辑。提供从入门到精通的系列干货、精选行业报告与实用工具,构建你的数字化知识体系,关注我,用实战经验照亮你的数字化之路。 1591

前端常用算法集合

假设在今日头条里面,有很多工作人员检查新闻是不是属于虚假新闻,所有新闻真实率到达了98%,工作人员在检验一个真实的新闻把它检验为一个虚假的新闻的概率为2%,而一个虚假的新闻被检验为真实的新闻的概率为5%. 那么,一个被检验为真实的新闻确实是真实的新闻的概率是多大?从[a, b]到[a, b, c],结果其实是[a, b]的结果加上c元素,然后将[a, b]结果中的每一个元素和c进行组合,得到[a, b, ab, c, ac, bc, abc],总数为3+1+3 = 7。这步做完后,最后的元素会是最大的数。

weixin_47588164的博客 1769

告别安装烦恼!Orange3 3.38.0 Windows绿色版下载即用,附保姆级汉化与组件配置指南

本文详细介绍了Orange3 3.38.0 Windows绿色版的下载与使用,包括中文汉化、组件配置及高效管理技巧。这款无需安装的数据科学工具特别适合快速验证想法的研究人员和移动办公用户,支持多种数据源和可视化工具,大幅提升工作效率。

weixin_30897233的博客 602

前端需要知道的数据结构与算法

前端需要知道的数据结构与算法 基本数据结构 JS 数据类型 基本类型(栈 stack): Number String Boolean Null Undefined 和 Symbol(es6 新增)引用类型(堆 heap):Object Array Function Data 数据结构 数据结构是指相互之间存在着一种或多种关系的数据元素的集合和该集合...

w1366352655的博客 284

【GlobalMapper精品教程】094:GlobalMapper26简体中文版安装教程(附安装包下载)

【GlobalMapper精品教程】094:GlobalMapper26简体中文版安装教程(附安装包下载)- 基于深度学习的图像分析工具,用于自动识别土地覆盖分类、建筑物提取和车辆检测。新的太阳阴影分析工具,用于计算加载地形和 3D 要素的阴影。新的 GENERATE_SHADOWS 脚本命令允许自动执行这些计算。新增点云模型关键点自动识别。能够在自动点云分析工具中保存和加载自定义创建的要素模型。改进了像素到点中各种潜在重叠图像中 GCP 的自动识别。

智慧空间实验室 4895

完美解决unknown failed to transfer from http://0.0.0.0/ during a previous attempt的错误

完美解决unknown failed to transfer from http://0.0.0.0/ during a previous attempt的错误

念兮为美 2279

学前端,这几个算法你必须知道

1.杨辉三角: 杨辉三角,是二项式系数在三角形中的一种几何排列。在欧洲,这个表叫做帕斯卡三角形。帕斯卡(1623----1662)是在1654年发现这一规律的,比杨辉要迟393年,比贾宪迟600年。 JavaScript版本: 运行结果: Java版本: 运行结果: 其中二位数组用js去理解,就是第一个参数为有几个对象,第二个参数为对象中有几个值,相当于开辟空间

qq_30325409的博客 2630

6、基于深度强化学习的无人机路径规划

本文研究了基于深度强化学习的无人机路径规划方法,提出了一种融合改进DQN算法与人工势场法的路径规划策略。通过设计合理的网络结构、状态空间、动作空间和奖励函数,结合ε-贪心策略进行动作选择,实现了无人机在复杂环境中的自主避障与目标导向飞行。仿真实验表明,该方法具有收敛速度快、实时性强和可操作性高等优点,能有效完成室内环境下的路径规划任务。文章还总结了算法优势,并对未来在连续动作、复杂环境适应及多无人机协同等方面的发展方向进行了展望。

web39explorer的博客 166

前端数据结构与算法(JS版)——那些你不得不知道的算法

前端算法(JS版)一、算法简述1.1 为何学习算法1.2 学习算法的三部曲1.3 如何刷题二、数据结构与算法简介2.1 数据结构2.2 算法2.3 数据结构与算法2.4 数据结构分类三、如何刷LeetCode3.1 LeetCode简介3.2 如何在题库中搜索3.3 如何做题四、时间复杂度五、空间复杂度明日继续——栈 一、算法简述 1.1 为何学习算法 算法现在是程序员标配,一个会算法的程序员无疑在更多的地方占优势。对于前端来说,算法更是敲开大厂的敲门砖,让我们在大厂的面试中占尽优势。同时,掌握算法让我们在

wangxiaochaoc的博客 570

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

你不知道的前端算法之文字避让

本文作者:TalkingData 可视化工程师李凤禄 编辑:Aresn inMap 是一款基于 canvas 的大数据可视化库,专注于大数据方向点线面的可视化效果展示。目前支持散点、围栏、热力、网格、聚合等方式;致力于让大数据可视化变得简单易用。 GitHub 地址:https://github.com/TalkingData/inmap 文档地址:http://inmap.talkingda...

寻找灵感,发现精彩。 140

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

你不知道的前端算法之热力图的实现

本文作者:TalkingData 可视化工程师李凤禄 编辑:Aresn 欢迎加入 QQ 群参与技术讨论:618308202 inMap 是一款基于 canvas 的大数据可视化库,专注于大数据方向点线面的可视化效果展示。目前支持散点、围栏、热力、网格、聚合等方式;致力于让大数据可视化变得简单易用。 GitHub 地址:https://github.com/TalkingData/inmap (...

寻找灵感,发现精彩。 188

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

前端需要知道的数据结构与算法(持续更新中...)

基本数据结构 JS 数据类型 基本类型(栈 stack): Number String Boolean Null Undefined 和 Symbol(es6 新增)引用类型(堆 heap):Object Array Function Data 数据结构 数据结构是指相互之间存在着一种或多种关系的数据元素的集合和该集合中数据元素之间的关系...

weixin_34331102的博客 395

Web前端最全学习前端算法前你需要了解的‘大O表示法’(1),作为一名web前端面试者你应该知道的知识

正值招聘旺季,很多小伙伴都询问我有没有前端方面的面试题!开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】定义:如果一个问题的规模是n,解这一问题的某一算法所需要的时间为T(n),它是n的某一函数 T(n)称为这一算法的“时间复杂性”。当输入量n逐渐加大时,时间复杂性的极限情形称为算法的“渐近时间复杂性”。我们常用大O表示法表示时间复杂性,注意它是某一个算法的时间复杂性。

2301_82244330的博客 780

前端算法题 | 这道题效率最高的算法,你可能不知道?

寻找最长的不含有重复字符的子串 可能看标题不会明白这个题到底什么意思,来看看下面的例子: abcabcbb ➡abc➡ 3 bbbb ➡b➡ 1 pwwkew ➡wke➡ 3 看了栗子是不是明白了呢? 其实需求很简单,实现的方法也很多,不过在这里我要来写一种效率最高的算法,只需要一次循环就可解决: function fi...

Duanyh2016的博客 177
上一篇: nvm node版本管理工具安装
下一篇: Vue-cli开发多页面应用
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值