【(格式化字符串)】

继续「快刷四部曲」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。

相关推荐
倒头就睡的小比特20 小时前
算法竞赛C++常用的STL
c++·算法
小羊没烦恼!21 小时前
初探性能优化——2个月到4小时的性能提升
java·开发语言·windows·算法·c#
猎头南楼1 天前
知识社区推荐系统实践:新用户冷启动与长短期兴趣建模的挑战 资深推荐算法工程师
人工智能·深度学习·算法·机器学习
旖旎夜光1 天前
力控面试题 01.01: 判定字符是否唯一(位运算) —— 题解
c++·学习·算法·leetcode·力控
wzdark1 天前
大规模并行计算中的负载均衡算法研究4
算法
Because_of_Her11 天前
并查集-听课笔记
笔记·算法·并查集
码流子1 天前
高速公路安全监测实践:碰撞监测预警+物联网底座,从感知到处置的闭环
大数据·人工智能·物联网·算法·架构
another heaven1 天前
【算法/C++ MD5算法能否逆解码?原理、C++实现与同类哈希算法对比】
c++·算法·哈希算法
wzdark1 天前
从算法设计模式看编程思维的抽象能力4
算法
2601_962218611 天前
万象生鲜系统称重自动多退少补算法解决生鲜非标品痛点
大数据·数据库·人工智能·python·算法