rust 算法题求优化之 列表的减法

编写一个 array_diff 函数,以两个列表为参数,从一个列表中减去另一个,即如下:

array_diff(vec![1,2], vec![1]) == vec![2]
// 如果被减的列表中要删除的数有重复,则会一齐删除重复的
array_diff(vec![1,2,2,2,3], vec![2]) == vec![1,3]

我的代码是:

fn array_diff<T: PartialEq>(a: Vec<T>, b: Vec<T>) -> Vec<T> {
    let mut lb = b.iter();
    let mut a = a;
    loop {
        match lb.next() {
            Some(b_item) => {
                let len_a = a.len();
                for i in (0..=len_a).rev() {
                    if Some(b_item) == a.get(i) {
                        a.remove(i as usize);
                    }
                }
            }
            None => break,
        }
    }
    a
}

代码不尽人意,还请指正改进。

最佳答案

你好,如果函数头是一样的话,这个题属于比较简单的类型,你的做法虽然没有问题,但是却会把简单问题复杂化,如果我们采用你发的上一题下我的回答中的那种做法(也就是闭包和用以简化的函数),应该会产生很简洁的代码,我提供这么一个:

fn array_diff<T: PartialEq>(a: Vec<T>, b: Vec<T>) -> Vec<T> {
    a.into_iter().filter(|x| !b.contains(x)).collect()
}

经过上一题,你应该看得懂这个吧?

3年前 评论
lve_me (楼主) 3年前
chen0adapter (作者) 3年前
lve_me (楼主) 3年前
chen0adapter (作者) 3年前
Rays 3年前
讨论数量: 1

你好,如果函数头是一样的话,这个题属于比较简单的类型,你的做法虽然没有问题,但是却会把简单问题复杂化,如果我们采用你发的上一题下我的回答中的那种做法(也就是闭包和用以简化的函数),应该会产生很简洁的代码,我提供这么一个:

fn array_diff<T: PartialEq>(a: Vec<T>, b: Vec<T>) -> Vec<T> {
    a.into_iter().filter(|x| !b.contains(x)).collect()
}

经过上一题,你应该看得懂这个吧?

3年前 评论
lve_me (楼主) 3年前
chen0adapter (作者) 3年前
lve_me (楼主) 3年前
chen0adapter (作者) 3年前
Rays 3年前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!