402. 移掉 K 位数字

前置知识:对于两个数 123a456 和 123b456,如果 a > b, 那么数字 123a456 大于 数字 123b456,否则数字 123a456 小于等于数字 123b456(基于这个来考虑的)。也就说,两个相同位数的数字大小关系取决于第一个不同的数的大小。
感谢题解
image.pngimage.png
image.png
image.pngimage.png

  1. pub fn remove_kdigits(num: String, mut k: i32) -> String {
  2. let remain = num.len() - k as usize; // 需要的长度
  3. let mut stack = vec![];
  4. num.chars().for_each(|c| {
  5. while k > 0 && !stack.is_empty() && *stack.last().unwrap() > c {
  6. stack.pop();
  7. k -= 1;
  8. }
  9. stack.push(c);
  10. });
  11. // 接下来是处理里面可能存在的0,以及另一种情况,丢弃的k个没丢完
  12. // 注意这里丢弃的0不计入k,因此直接将最后结果截取出来需要的长度
  13. stack.truncate(remain);
  14. let res = stack.into_iter()
  15. .skip_while(|c| *c == '0').collect::<String>();
  16. if res.is_empty() { "0".to_string() }
  17. else {
  18. res
  19. }
  20. }

316. 去除重复字母

321. 拼接最大数

1081. 不同字符的最小子序列