本帖最后由 cxywz 于 2023-11-21 15:25 编辑
主公式:清洗数据剔除逗号,将递归的结果去除前导0(超人大佬提供的方法):
递归公式(思路:删除右边k-1个字符后的字符,取最大值,找到这个最大值位置,取这个位置右边字符串递归,并合并结果):(本方法用字符串方法,用数组方法方便点)
- =LET(
- r, dg(SUBSTITUTE(A2, ",", ""), B2),
- mh, MATCH(TRUE, MID(r, SEQUENCE(LEN(r)), 1) > "0", ),
- IFNA(MID(r, mh, 999), "0")
- )
复制代码- dg = LAMBDA(str, k,
- IF(
- k = 1, //递归退出条件,剩下的字符取最大的
- MAX(--RIGHT(LEFT(str, SEQUENCE(LEN(str))))),
- LET(
- leftlen, LEN(str) - (k - 1), //截取右边k-1后的字符找最大数值
- maxc, MAX(--RIGHT(LEFT(str, SEQUENCE(leftlen)))),
- n, FIND(maxc, str), //这个字符的首位置
- maxc & dg(MID(str, n + 1, 999), k - 1) //最大字符后的数据进行递归合并
- )
- )
- )
复制代码 根据上面的思路,改写为循环公式,仅需要循环K次:
- =LET(
- data, --TEXTSPLIT(A2, , ","),
- k, B2,
- r, TAKE(
- REDUCE(
- data,
- SEQUENCE(k),
- LAMBDA(x, y,
- LET(
- maxn, MAX(DROP(x, -k + 1)),
- mh, MATCH(maxn, x, ),
- VSTACK(DROP(x, mh), maxn)
- )
- )
- ),
- -k
- ),
- IF(
- k = 1,
- MAX(data),
- IFNA(CONCAT(DROP(r, MATCH(TRUE, r > 0, ) - 1)), 0)
- ) & ""
- )
复制代码
|