太厉害了,堆栈学到了。这题的 @x<0 max -y 这个很精巧。
根据老师的思路,我来个思路简单点的:只要碰到},结果都保存到堆栈的底端(第几个{,匹配到}的第几个{,匹配到的}的位置),最终将这个结果取出来就行。
- /**
- 第n个{对应}的位置
- strs:匹配字符串
- n:第几个
- */
- fx = LAMBDA(strs, n,
- LET(
- r, REDUCE(
- 0,
- SEQUENCE(LEN(strs)),
- LAMBDA(x, y,
- LET(
- lastx, @TAKE(x, -1),
- SWITCH(
- MID(strs, y, 1),
- "{", VSTACK(1 + lastx, x, 1 + lastx), //x上下都扩展,上面用于堆栈,下面保存个数
- //利用hstack 保存结果,行首保存lastx,中间保存匹配的{的位置,最后保存的y就是}的位置
- "}", VSTACK(DROP(x, 1), HSTACK(lastx, @x, y)),
- x
- )
- )
- )
- ),
- //r 所有{}的匹配结果是3列,{个数,匹配到}的第几个{,}的位置
- FILTER(CHOOSECOLS(r, 3), IFNA(CHOOSECOLS(r, 2), ) = n)
- )
- );
复制代码 |