【算法学习】02-利用数据结构思维解决问题
发表于:2024-05-17 |

前言

最近在公司遇到个小需求,大概就是一段字符串’【测试1】 【测试2】 ….’,就类似与【】这个符号,包裹着字符串,我需要根据这些个字符串进行后续的操作,换句话讲,核心就是将【】中的文字给提取出来。不知道大家会怎么做,我当时就想到了一个数据结构–栈,先进后出的想法。

实现思路

当我们匹配到的时候,将后续的内容压到栈底部,等再次匹配到的时候,将内容出栈

代码实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
const remark=`【缺提单号】 【缺合同号】 【缺收发货人】 【缺生产销售单位】 【缺境外收货人】 【缺运输方式】 【缺监管方式】 【缺征免性质】 【缺贸易国】 【缺运抵国】 【缺指运港】 【缺成交方式】 【缺杂费数量】 【缺杂费币制】 【缺件数】 【缺毛重】 【缺净重】 【缺包装种类】 【缺船名】 【缺航次】 【缺许可证号】 【品1:缺成交数量】 【品1:缺成交单位】 【品1:缺总价】 【品1:缺千克数】 【品1:缺币制】 【品1:缺征免】 【品1:缺原产国】 【品1:缺最终目的国】 【品1-6:缺千克数】`
// 利用栈的数据结构逻辑,匹配【】中的文字
const stack = [];
let str = "";
let isStart = false;
for (let i = 0; i < remark.length; i++) {
const curStr = remark[i];
if (curStr === "【") {
isStart = true;
}
// 避免将【】中的内容也加入到str中
if (isStart&&curStr !== "【" && curStr !== "】") {
str += curStr;
}
if (curStr === "】") {
isStart = false;
stack.push(str);
str = "";
}
}

经过这样的操作,我们就可以简单的得到我们【】中字符串的数组了。

其他思路

当然你也可以用我们常用的正则来进行匹配

代码实现

1
2
const regex = /【(.*?)】/g;
const matches = remark.match(regex);

这段代码使用了正则表达式 /【(.?)】/g,其中 【(.?)】 表示匹配以 “【” 开始,以 “】” 结束的内容,并使用 .*? 来匹配任意字符,非贪婪模式。

通过调用字符串的 match() 方法,传入正则表达式作为参数,可以获取到所有匹配的结果,即所有位于【】中的字符串。

此时并没有达到我上面的效果,还是需要进行一次replace

1
const results = matches.map(match => match.replace(/【|】/g, ''));

这个算法也可以进行实现我的需求,但是时间复杂度要大于栈的处理方式

结语

本篇文章就到这里了,这是我写代码时感到挺有意思的,就想着和大家分享一下,债见~

上一篇:
语法记录-JS中一些简洁语法记录
下一篇:
简单实现一个列配置