rust实现全排列

这篇文章是rust解决算法问题的第二篇,第一篇文章是rust实现两数之和 – 掘金 (juejin.cn),感兴趣的同学可以去看一下,话不多说,直接进入正题。

46. 全排列 – 力扣(LeetCode) (leetcode-cn.com)这道题,在我秋招美团面试的时候被问起过,不过我当时并没有很完整的写出来(是我有点菜),不过这些也是过去式了,至于具体的解决思路,leetcode上面有各路大神的讲解,在这里我就不多加赘述了。

image.png

下面列出的代码已通过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 返回的元组中,第一个元素是索引,第二个元素是集合中元素的引用。

image.png

还有一方面就是如何截取可变数组vector的一部分,刚开始我的想法是有没有一些方法,类似于js的slice那样,在浏览的过程中,我想到了更加简洁的东西,那就是切片,rust程序设计语言里面有这样一句话,

image.png
那么我们截取可变数组就可以通过&vec[i..j]的方式了。除了截取还有就是可变数组的合并,这里我查阅了有关资料Vec in std::vec – Rust (rust-lang.org),看到了concat方法以及join方法,api比较简单,这里只放截图,感兴趣的同学点击上方链接自行查阅。

image.png

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享