Algorithm
lc2138_将字符串拆分为若干长度为 k 的组
思路:
直接申请一个长度为 (s.len() + k - 1) / k
的数组,然后直接遍历,每次取 k 个字符,如果不够,则用 fill 填充。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
impl Solution {
pub fn divide_string(s: String, k: i32, fill: char) -> Vec<String> {
let len = (s.len() + k as usize - 1) / k as usize;
let mut result = Vec::with_capacity(len);
let chars: Vec<char> = s.chars().collect();
for i in (0..s.len()).step_by(k as usize) {
let mut group = String::new();
for j in i..(i + k as usize).min(s.len()) {
group.push(chars[j]);
}
// 如果最后一组长度不够k,用fill填充
while group.len() < k as usize {
group.push(fill);
}
result.push(group);
}
result
}
}
|
题解的直接填入s[curr..end]
+提前分配数组内存的实现更加省内存,可以吃到双100%的时间和内存领先:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
impl Solution {
pub fn divide_string(s: String, k: i32, fill: char) -> Vec<String> {
let len = (s.len() + k as usize - 1) / k as usize;
let mut res = Vec::with_capacity(len);
let n = s.len();
let mut curr = 0; // 每个分组的起始下标
// 拆分字符串
while curr < n {
let end = (curr + k as usize).min(n);
res.push(s[curr..end].to_string());
curr += k as usize;
}
// 尝试填充最后一组
if let Some(last) = res.last_mut() {
if last.len() < k as usize {
*last += &fill.to_string().repeat(k as usize - last.len());
}
}
res
}
}
|
Review
【TED演讲】你为何只会是平凡的人
成就一番事业:
- 需要不断不断寻找并尝试自己的热情所在
- 不要用维护各种关系(子女,伴侣,父母)为借口来逃避自己对尝试失败的恐惧
- 人生最怕如果,做出选择然后大胆去干
Tip
搜索、推荐、广告、用增等工业界实践文章合集
Share
Li.fi和Jumper.exchange介绍