楼主:
yam276 ('_')
2025-06-06 16:40:44443. String Compression
https://leetcode.com/problems/string-compression/
题意:
给你一个如 a, a, b, b, b, c, c 的字符阵列
你要让他们变成 a, 2, b, 3, c, 2 这种简化阵列
并只能修改原阵列 要 in-place 并回传修改后阵列的边界 index
思路:
双指标
当 chars[left] 不等于 chars[right] 的时候 就开始修改
但还需要一个 write 指标
我一开始想让 left 做太多事情结果手忙脚乱
正确应该是这样
示意图:
Step 1.
遇到 字符[左] 不等于 字符[右]
写
左 右
↓ ↓
a, a, a, b, b, ...
Step 2.
写 +1 并写入 右减左(3-0) 就是 count
左 写 右
↓ ↓ ↓
a, 3, a, b, b, ...
Step 3.
写 +1 并 左=右
左
写 右
↓ ↓
a, 3, a, b, b, ...
Step 4.
右持续 +1 直到遇到 Step 1. 的情况或跑完阵列
写 左 右
↓ ↓ ↓
a, 3, a, b, b, ...
Step 5.
回传 write 而不是 left
Code:
impl Solution {
pub fn compress(chars: &mut Vec<char>) -> i32 {
let mut write = 0;
let mut left = 0;
let length = chars.len();
for right in 0..=length {
if right == length || chars[left] != chars[right] {
let count = right - left;
chars[write] = chars[left];
write += 1;
if count > 1 {
for c in (count).to_string().chars() {
chars[write] = c;
write += 1;
}
}
left = right;
}
}
write as i32
}
}