Contents

ARST打卡第320周

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演讲】你为何只会是平凡的人

成就一番事业:

  1. 需要不断不断寻找并尝试自己的热情所在
  2. 不要用维护各种关系(子女,伴侣,父母)为借口来逃避自己对尝试失败的恐惧
  3. 人生最怕如果,做出选择然后大胆去干

Tip

搜索、推荐、广告、用增等工业界实践文章合集

Share

Li.fi和Jumper.exchange介绍