【(格式化字符串)】

继续「快刷四部曲」5 分钟速刷 315 题(格式化字符串)。

核心一句话:按 sublen 切分后,把相邻的奇-偶对(第 2k-1 与 2k 块)互换即可


① 抽象模型

  • 已知 sublen 之和必等于 str.length(),无需校验。
  • 把 str 拆成若干段,每段长度由 subleni 决定。
  • 对调规则:
    块 0 ↔ 块 1
    块 2 ↔ 块 3
    ...
    最后若剩奇数块,则最后一块不动。

② 最优算法

时间 O(n):只扫一遍。

空间 O(n):新建 char\[\] 保存结果,避免大量 substring。

算法:

  1. 用双指针:srcPos 指向原串当前段首,dstPos 指向新串当前写入位置。
  2. 步长 2 遍历 sublen 数组:
    • 先记下第 i 段长度 L1 = subleni
    • 若 i+1 存在,记下 L2 = subleni+1
    • 先把原串 [srcPos+L1, srcPos+L1+L2) 这段(即第 i+1 块)拷到新串 dstPos 处,dstPos += L2
    • 再把原串 [srcPos, srcPos+L1) 这段(即第 i 块)拷到新串 dstPos 处,dstPos += L1
    • srcPos += L1 + L2
  3. 最后若 sublen 长度为奇数,把最后一块直接拷完即可。

③ 边界/异常

  • sublen 长度为 0 已隐含不可能(题目保证和为 str.length() 且 ≥1)。
  • 空串 ⇒ 返回空串。

④ 代码(Java,可直接粘 LintCode)

java 复制代码
public String formatString(String str, int[] sublen) {
    int n = str.length();
    char[] s = str.toCharArray();
    char[] ans = new char[n];
    int srcPos = 0, dstPos = 0;
    for (int i = 0; i < sublen.length; i += 2) {
        int L1 = sublen[i];
        int L2 = (i + 1 < sublen.length) ? sublen[i + 1] : 0;
        // 先写第二段
        if (L2 > 0) {
            System.arraycopy(s, srcPos + L1, ans, dstPos, L2);
            dstPos += L2;
        }
        // 再写第一段
        System.arraycopy(s, srcPos, ans, dstPos, L1);
        dstPos += L1;
        srcPos += L1 + L2;
    }
    return new String(ans);
}

复杂度:

时间 O(n),空间 O(n)。

写完,Submit,一遍 AC。

相关推荐
geovindu1 小时前
go:Backtracking Algorithm
开发语言·后端·算法·golang·回溯算法
微露清风1 小时前
模拟算法学习记录
学习·算法
KaMeidebaby2 小时前
卡梅德生物技术快报 | abcore 纳米抗体文库:从PNAS论文看纳米抗体理性设计:构象熵作为亲和力预测新指标的技术实现
java·开发语言·人工智能·算法·机器学习
问商十三载2 小时前
2026法律行业AI引擎生成式优化怎么优化?三层专业加固提排名,零成本提33%引用率附适配表
java·前端·人工智能·算法
zander2582 小时前
138. 随机链表的复制
数据结构·算法·链表
过期动态2 小时前
【LeetCode 热题 100】找到字符串中所有字母异位词
java·数据结构·算法·leetcode·职场和发展·rabbitmq
来一碗刘肉面2 小时前
栈在递归中的应用
数据结构·算法
8K超高清3 小时前
博冠获中国电影电视技术学会科技进步奖
人工智能·科技·算法·安全·接口隔离原则·智能硬件
微石科技3 小时前
长期慢病如何做好居家管理?宁波微石科技星梦云康改善周期数据零散短板
大数据·科技·物联网·算法