# 2379. 得到 K 个黑块的最少涂色次数 ### description: ​ 给你一个正整数数组 nums,请你移除 最短子数组(可以为空),使得剩余元素的和能被 p 整除。 不允许 将整个数组都移除。请你返回你需要移除的最短子数组的长度,如果无法满足题目要求,返回 -1 。子数组定义为原数组中连续的一组元素。 代码: minimum_recolors为正确写法。 ```rust fn main() { let blocks = String::from("WWBWWBBWBW"); let nums = 7usize; let res = minimum_recolors(&blocks, nums); println!("minimum_recolors {}", res); let res = minimum_recolors1(&blocks, nums); println!("minimum_recolors1 {}", res); } // 错误代码 fn minimum_recolors1(blocks: &str, nums: usize) -> usize{ let mut l = 0usize; let mut r = 0usize; let mut cnt = 0usize; let mut blocks = blocks.chars(); // Chars() 为一个字符串类型的迭代器,不是字符数组。没有len方法、 // blocks.len() -- no method named `len` found for struct `Chars` in the current scope blocks.as_str().len(); //这样可以。 println!("blocks.len() is {}", blocks.as_str().len()); while r < nums { cnt += if blocks.next() == Some('W') {1} else { 0 }; r += 1; } println!("blocks.len() is {}", blocks.as_str().len()); // 使用向量 此时的blocks为字符串迭代器。 如果为字符串应该写成 blocks.chars().collect::>(); let mut blocks = blocks.collect::>(); // 当使用一个 usize 类型的值作为数组索引时,需要将它转换为整数类型,例如 i32,可以使用 as 关键字进行强制类型转换: let mut res= cnt; while r < blocks.len() { print!("不会执行,因为迭代器只剩下(WBW)三个元素!故而此时向量长度为3,小于r"); cnt += if blocks[r] == 'W' {1} else { 0 }; cnt -= if blocks[l] == 'W' {1} else { 0 }; res = res.min(cnt); l += 1; r += 1; } // 而此时已经失去了原始blocks, 可知此种情况应该在一开始转为向量!除了遍历,别用什么迭代器。 res } pub fn minimum_recolors(blocks: &str, k: usize) -> usize { let blocks_chars = blocks.chars().collect::>(); let mut l = 0usize; let mut r = 0usize; let mut cnt = 0usize; while r < k { if blocks_chars[r] == 'W' { cnt += 1; } r += 1; } let mut res = cnt; while r < blocks_chars.len() { if blocks_chars[r] == 'W' { cnt += 1; } if blocks_chars[l] == 'W' { cnt -= 1; } res = res.min(cnt); l += 1; r += 1; } res } ```