分享几道大厂面试算法题

简介: 分享几道大厂面试算法题

前言

作者目前在江西的一所双非本科就读,春招准备冲击一下大厂,最近也是一直在准备面试,看到了几道算法题,想着写一篇文章在掘金上分享一下,希望也可以帮助到一些小伙伴。

正文

标准货币表达方式

我们知道,标准货币的表达方式为 1,234,567, 设计一个函数,传入一个Number的数字,将它变成标准的货币表达方式。

function formatNumberWithCommas(nummber) {
    if(typeof nummber !== 'number') {
        return;
    }
    // 类型转换
    nummber += ""
    let [interger, decimal] = nummber.split(".")
    // 内部函数封装  复用  整数和小数部分都要千分位
    const doSplit = (num, isInteger = true) => {
        if (num === '') return ''
        if (isInteger) num = num.split('').reverse()
        let str = []
        for (let i = 0; i < num.length; i++){
            if (i !== 0 && i % 3 === 0) {
                str.push(',')
            }
            str.push(num[i])
        }
        if (isInteger) return str.reverse().join('')
        return str.join('')
    }
    interger = doSplit(interger)
    decimal = doSplit(decimal, false)
    return interger + (decimal === '' ? '' : '.' + decimal)
}
  • if(typeof nummber !== 'number') { return; }: 首先检查传入的参数 nummber 是否为数字类型,如果不是数字类型的话,则返回,不进行任何操作。
  • nummber += "": 将数字类型的参数转换为字符串,方便后续的处理。接下来会使用字符串的方法。
  • let [interger, decimal] = nummber.split("."):我们将数字类型转化为字符串后,判断这段数字是否有小数部分,如果有小数部分,将字符串以小数点分割开,整数部分赋值给interger,小数部分赋值给decimal
  • const doSplit = (num, isInteger = true) => { ... }: 定义了一个内部函数 doSplit,用于给整数或小数部分加上千位分隔符。该函数接受两个参数:num 表示要处理的数字部分,isInteger 表示是否是整数部分,默认值为 true
  • 如果传入的num为整数的话,我们会将num进行翻转,因为我们知道,整数进行千位分隔的话,需要个位数开始算。
  • for (let i = 0; i < num.length; i++){ ... }: 在 doSplit 函数中使用循环遍历数字的每一位,并在每三位数字之间插入一个逗号(,)作为千位分隔符。
  • return interger + (decimal === '' ? '' : '.' + decimal): 将整数部分和小数部分拼接起来,如果没有小数部分,则直接返回整数部分;否则,在整数部分后面加上小数点(.)和小数部分。

DFS 和 BFS

DFS(深度优先搜索)和 BFS(广度优先搜索)是图论中两种常用的搜索算法,用于遍历图中的节点。它们在解决许多图论问题以及树问题时非常有用。

下面是对 DFS 和 BFS 的简要说明:

深度优先搜索(DFS)

  • 工作原理:DFS 从图的某个节点开始,沿着图的边深入直到不能再深入为止,然后回溯到上一个节点,再继续沿着其他的路径进行深度搜索,直到所有节点都被访问过为止。
  • 数据结构:DFS 一般使用递归或者栈来实现。
  • 适用情况:适用于寻找路径、解决连通性问题等,也可以用于生成拓扑排序等。
  • 特点:DFS 可以更快地到达深层节点,但不保证找到最短路径。
function dfs(node){
    console.log(node.value)
    for(let child of node){
        dfs(child)
    }
}

广度优先搜索(BFS)

  • 工作原理:BFS 从图的某个节点开始,先访问所有与该节点相邻的节点,然后依次访问相邻节点的相邻节点,依此类推,直到所有节点都被访问过为止。
  • 数据结构:BFS 一般使用队列来实现。
  • 适用情况:适用于寻找最短路径、解决连通性问题、生成最小生成树等。
  • 特点:BFS 保证找到的路径是最短的。
function bfs(root){
    let queue = []
    queue.push(root)
    while(queue.length){
        let currentNode = queue.shift()
        if(currentNode.children){
            for(let child of currentNode.children){
                queue.push(child)
            }
        }
    }
}
相关文章
|
2月前
|
负载均衡 NoSQL 算法
一天五道Java面试题----第十天(简述Redis事务实现--------->负载均衡算法、类型)
这篇文章是关于Java面试中Redis相关问题的笔记,包括Redis事务实现、集群方案、主从复制原理、CAP和BASE理论以及负载均衡算法和类型。
一天五道Java面试题----第十天(简述Redis事务实现--------->负载均衡算法、类型)
|
2月前
|
算法 Go
[go 面试] 雪花算法与分布式ID生成
[go 面试] 雪花算法与分布式ID生成
|
6天前
|
算法 Java 数据库
美团面试:百亿级分片,如何设计基因算法?
40岁老架构师尼恩分享分库分表的基因算法设计,涵盖分片键选择、水平拆分策略及基因法优化查询效率等内容,助力面试者应对大厂技术面试,提高架构设计能力。
美团面试:百亿级分片,如何设计基因算法?
|
5天前
|
算法 Java 数据库
美团面试:百亿级分片,如何设计基因算法?
40岁老架构师尼恩在读者群中分享了关于分库分表的基因算法设计,旨在帮助大家应对一线互联网企业的面试题。文章详细介绍了分库分表的背景、分片键的设计目标和建议,以及基因法的具体应用和优缺点。通过系统化的梳理,帮助读者提升架构、设计和开发水平,顺利通过面试。
美团面试:百亿级分片,如何设计基因算法?
|
14天前
|
算法 Java 数据中心
探讨面试常见问题雪花算法、时钟回拨问题,java中优雅的实现方式
【10月更文挑战第2天】在大数据量系统中,分布式ID生成是一个关键问题。为了保证在分布式环境下生成的ID唯一、有序且高效,业界提出了多种解决方案,其中雪花算法(Snowflake Algorithm)是一种广泛应用的分布式ID生成算法。本文将详细介绍雪花算法的原理、实现及其处理时钟回拨问题的方法,并提供Java代码示例。
35 2
|
1月前
|
机器学习/深度学习 JavaScript 算法
面试中的网红虚拟DOM,你知多少呢?深入解读diff算法
该文章深入探讨了虚拟DOM的概念及其diff算法,解释了虚拟DOM如何最小化实际DOM的更新,以此提升web应用的性能,并详细分析了diff算法的实现机制。
|
2月前
|
JavaScript 算法 索引
【Vue面试题二十三】、你了解vue的diff算法吗?说说看
这篇文章深入分析了Vue中的diff算法,解释了其在新旧虚拟DOM节点比较中的工作机制,包括同层节点比较、循环向中间收拢的策略,并通过实例演示了diff算法的执行过程,同时提供了源码层面的解析,说明了当数据变化时,如何通过Watcher触发patch函数来更新DOM。
【Vue面试题二十三】、你了解vue的diff算法吗?说说看
|
2月前
|
算法
聊聊一个面试中经常出现的算法题:组合运算及其实际应用例子
聊聊一个面试中经常出现的算法题:组合运算及其实际应用例子
|
2月前
|
机器学习/深度学习 算法 数据中心
【机器学习】面试问答:PCA算法介绍?PCA算法过程?PCA为什么要中心化处理?PCA为什么要做正交变化?PCA与线性判别分析LDA降维的区别?
本文介绍了主成分分析(PCA)算法,包括PCA的基本概念、算法过程、中心化处理的必要性、正交变换的目的,以及PCA与线性判别分析(LDA)在降维上的区别。
72 4
|
2月前
|
算法
突击面试:解密面试官的算法题集合
突击面试:解密面试官的算法题集合