前言
作者目前在江西的一所双非本科就读,春招准备冲击一下大厂,最近也是一直在准备面试,看到了几道算法题,想着写一篇文章在掘金上分享一下,希望也可以帮助到一些小伙伴。
正文
标准货币表达方式
我们知道,标准货币的表达方式为 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) } } } }