就一个普通题目,对矩阵的对角线进行排序,这题中英文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]);
}
}
// ??????
}
}
球球大佬们指点指点
1
共 6 条评论, 1 页
评论区
写评论资瓷,没有读中文这么流畅,但还是勉强能读,反正现在怎么都避不开英文资料了
对以下内容的回复:
其实文档里也写了的,不过需要会英文。 https://doc.rust-lang.org/edition-guide/rust-2018/ownership-and-lifetimes/the-anonymous-lifetime.html
懂了谢谢,很多教程这种细节都一带而过没注意到,一说就明白了
对以下内容的回复:
就是让他推断生命周期,也就是代表这里是某个生命周期。其实d1也完全可以这么声明:
let mut d1: HashMap<i32, _>
这里的
_
也是让rust自己推断类型的意思。对以下内容的回复:
谢谢大佬,懂做了,go写法也会写了。
小小追问一下,
IterMut<'_, i32>>
这里的'_
是啥意思啊,感觉标准库里经常见到,但也没咋看懂,生命周期相关的都懵懵的,或者能推荐下啥教程讲的明白点的吗对以下内容的回复:
以下是从python翻译过来的。