这篇文章是rust解决算法问题的第二篇,第一篇文章是rust实现两数之和 – 掘金 (juejin.cn),感兴趣的同学可以去看一下,话不多说,直接进入正题。
46. 全排列 – 力扣(LeetCode) (leetcode-cn.com)这道题,在我秋招美团面试的时候被问起过,不过我当时并没有很完整的写出来(是我有点菜),不过这些也是过去式了,至于具体的解决思路,leetcode上面有各路大神的讲解,在这里我就不多加赘述了。
下面列出的代码已通过leetcode
impl Solution {
pub fn permute(nums: Vec<i32>) -> Vec<Vec<i32>> {
let mut vec = Vec::new();
if nums.len() == 1 {
vec.push(nums);
}
else{
for (i,_item) in nums.iter().enumerate() {
let left: i32 = nums[i];
let mut v1 = Vec::new();
v1.push(&nums[0..i]);
v1.push(&nums[i+1..]);
let right = v1.concat();
let arr = Solution::permute(right);
for (j,_item2) in arr.iter().enumerate() {
let mut vec2 = Vec::new();
vec2.push(left);
for item3 in &arr[j] {
vec2.push(*item3);
}
vec.push(vec2);
}
}
}
vec
}
}
复制代码
在写全排列之前,我是不知道,rust当中的for循环还能获取下标的,直到今天再次浏览Slice 类型 – Rust 程序设计语言 简体中文版 (kaisery.github.io)这里的内容时,我才发现了遍历可变数组等类型时,可以获得下标(之前我一直都是自己写变量逐次增加**)。**iter
方法返回集合中的每一个元素,而 enumerate
包装了 iter
的结果,将这些元素作为元组的一部分来返回。enumerate
返回的元组中,第一个元素是索引,第二个元素是集合中元素的引用。
还有一方面就是如何截取可变数组vector的一部分,刚开始我的想法是有没有一些方法,类似于js的slice那样,在浏览的过程中,我想到了更加简洁的东西,那就是切片,rust程序设计语言里面有这样一句话,
那么我们截取可变数组就可以通过&vec[i..j]的方式了。除了截取还有就是可变数组的合并,这里我查阅了有关资料Vec in std::vec – Rust (rust-lang.org),看到了concat方法以及join方法,api比较简单,这里只放截图,感兴趣的同学点击上方链接自行查阅。
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END