[R14A] 感叹句!


数据规模:1≤n≤1051 \le n \le 10^5,SS 仅由小写英文字母和 ? 构成。

思路

把字符串中每个 ? 替换成 ! 后原样输出。?(0x3F)与 !(0x21)都是单字节 ASCII 字符,直接在字节层面替换即可,不必按字符处理。

复杂度:时间 O(n)O(n),空间 O(n)O(n)。

仓颉实现

查看仓颉实现
import std.env.*
import std.convert.*

main() {
    let reader = getStdIn()
    let n = Int64.parse(reader.readln().getOrThrow())
    let s = reader.readln().getOrThrow()
    let bs = Array<UInt8>(n, { i =>
        if (s[i] == UInt8(0x3F)) {
            UInt8(0x21)
        } else {
            s[i]
        }
    })
    println(String.fromUtf8(bs))
}

要点:

  • 仓颉中字符串按下标访问得到的是 UTF-8 字节(UInt8),本题只涉及 ASCII 字符,字节级替换不会影响其他字节。
  • 处理完的字节数组用 String.fromUtf8 还原成字符串输出。