【(格式化字符串)】

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

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


① 抽象模型

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

② 最优算法

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

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

算法:

  1. 用双指针:srcPos 指向原串当前段首,dstPos 指向新串当前写入位置。
  2. 步长 2 遍历 sublen 数组:
    • 先记下第 i 段长度 L1 = sublen[i]
    • 若 i+1 存在,记下 L2 = sublen[i+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。

相关推荐
List<String> error_P9 小时前
蓝桥杯最后冲刺(三)
算法
样例过了就是过了9 小时前
LeetCode热题100 跳跃游戏
c++·算法·leetcode·贪心算法·动态规划
无限进步_10 小时前
【C++&string】寻找字符串中第一个唯一字符:两种经典解法详解
开发语言·c++·git·算法·github·哈希算法·visual studio
FluxMelodySun10 小时前
机器学习(二十九) 稀疏表示与字典学习(LASSO算法、KSVD算法、奇异值分解)
人工智能·算法·机器学习
LG.YDX10 小时前
笔试训练48天:跳台阶
数据结构·算法
汀、人工智能10 小时前
[特殊字符] 第42课:对称二叉树
数据结构·算法·数据库架构·图论·bfs·对称二叉树
环黄金线HHJX.10 小时前
【从0到1】
开发语言·人工智能·算法·交互
Book思议-10 小时前
【图】图的存储结构
算法·
深邃-10 小时前
【C语言】-数据在内存中的存储(1)
c语言·开发语言·数据结构·c++·算法
做怪小疯子10 小时前
LeetCode刷题——15.动态规划模式
算法·leetcode·动态规划