< 返回版块

lithbitren 发表于 2020-05-14 16:38

Tags:leetcode,语法

就一个普通题目,对矩阵的对角线进行排序,这题中英文leetcode都没有rust题解,真不知道咋参考了。 就像这个题解里的,py实现和go实现怎么翻译成rust呢?

https://leetcode-cn.com/problems/sort-the-matrix-diagonally/solution/1329-jiang-ju-zhen-an-dui-jiao-xian-pai-xu-by-tuot/

google了很久都没找到如何对二维数组或者hashmap的value进行排序,编译的时候总报borrow或mut错误。

py写法:

class Solution:
    def diagonalSort(self, mat: List[List[int]]) -> List[List[int]]:
        m, n, d = len(mat), len(mat[0]), collections.defaultdict(list)
        for i, j in itertools.product(range(m), range(n)):
            d[i - j].append(mat[i][j])
        d = {k: iter(sorted(v)) for k, v in d.items()}
        for i, j in itertools.product(range(m), range(n)):
            mat[i][j] = next(d[i - j])
        return mat

go写法:

func diagonalSort(mat [][]int) [][]int {
    m, n := len(mat), len(mat[0])
    d := make(map[int][]int, m + n - 1)
    for i := 0; i < m; i++ {
        for j := 0; j < n; j++ {
            d[i - j] = append(d[i - j], mat[i][j])
        }
    }
    for _, v := range d {
        sort.Ints(v)
    }
    it := make(map[int]int, m + n - 1)
    for i := 0; i < m; i++ {
        for j := 0; j < n; j++ {
            mat[i][j] = d[i - j][it[i - j]]
            it[i - j]++
        }
    }
    return mat
}

然后rust写法写到排序就写不下去了,不管是d.values().map()还是for循环都没法对元素排序。。

use std::collections::HashMap;
impl Solution {
    pub fn diagonal_sort(mat: Vec<Vec<i32>>) -> Vec<Vec<i32>> {
        let (m, n) = (mat.len(), mat[0].len());
        let mut d: HashMap<i32, Vec<i32>> = HashMap::new();
        for i in 0..m {
            for j in 0..n {
                d.entry((i - j) as i32).or_insert(vec![]).push(mat[i][j]);
            }
        }

        // ??????
    }
}

球球大佬们指点指点

评论区

写评论
作者 lithbitren 2020-05-16 14:39

资瓷,没有读中文这么流畅,但还是勉强能读,反正现在怎么都避不开英文资料了

对以下内容的回复:

xjkdev 2020-05-15 17:28

其实文档里也写了的,不过需要会英文。 https://doc.rust-lang.org/edition-guide/rust-2018/ownership-and-lifetimes/the-anonymous-lifetime.html

作者 lithbitren 2020-05-15 15:22

懂了谢谢,很多教程这种细节都一带而过没注意到,一说就明白了

对以下内容的回复:

xjkdev 2020-05-15 13:48

就是让他推断生命周期,也就是代表这里是某个生命周期。其实d1也完全可以这么声明:

let mut d1: HashMap<i32, _>

这里的_也是让rust自己推断类型的意思。

对以下内容的回复:

作者 lithbitren 2020-05-14 21:06

谢谢大佬,懂做了,go写法也会写了。

小小追问一下,IterMut<'_, i32>>这里的'_是啥意思啊,感觉标准库里经常见到,但也没咋看懂,生命周期相关的都懵懵的,或者能推荐下啥教程讲的明白点的吗

对以下内容的回复:

xjkdev 2020-05-14 19:08

以下是从python翻译过来的。

use std::collections::HashMap;
impl Solution {
    pub fn diagonal_sort(mut mat: Vec<Vec<i32>>) -> Vec<Vec<i32>> {
        let (m, n) = (mat.len(), mat[0].len());
        let mut d: HashMap<i32, Vec<i32>> = HashMap::new();
        for i in 0..m {
            for j in 0..n {
                d.entry((i - j) as i32).or_insert(vec![]).push(mat[i][j]);
            }
        }
        let mut d1: HashMap<i32, std::slice::IterMut<'_, i32>> = d.iter_mut().map(|(k,v)| {
            v.sort();
            (*k, v.into_iter())
        }).collect();
        for i in 0..m {
            for j in 0..n {
                let idx = (i - j) as i32;
                mat[i][j] = *d1.get_mut(&idx).unwrap().next().unwrap();
            }
        }
        mat
    }
}
1 共 6 条评论, 1 页