- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我试图通过逐行拆分顶部和底部行来解决leetcode上的螺旋顺序问题,但我遇到了我无法理解的借位检查器问题。这是产生编译错误的最小示例:
pub fn f(mut matrix: &mut [Vec<i32>]) {
while let Some((_, remainder)) = matrix.split_first_mut() {
matrix = remainder;
if let Some((_, remainder)) = matrix.split_first_mut() {
matrix = remainder;
}
}
}
这是我的完整代码,用于说明我要完成的工作:
impl Solution {
pub fn spiral_order(mut matrix: Vec<Vec<i32>>) -> Vec<i32> {
let mut matrix = &mut matrix[..];
if matrix.is_empty() {
return Vec::new();
}
let mut ans = Vec::with_capacity(matrix.len() * matrix[0].len());
while let Some((head, tail)) = matrix.split_first_mut() {
ans.append(head);
matrix = tail;
for row in matrix.iter_mut() {
ans.push(row.pop().unwrap());
}
if let Some((head, tail)) = matrix.split_last_mut() {
matrix = tail;
ans.extend(head.into_iter().rev().map(|&mut x| x));
}
}
ans
}
}
似乎认为内部借用与循环的下一次迭代中的后续外部借用发生冲突,但是我认为应该没问题,因为我将其余部分移回了矩阵,因此在迭代结束之前在其中有一个有效的
&mut [Vec<i32>]
。为什么无法编译,应如何解决?
最佳答案
我无法解释为什么您的原始版本无法编译,但是我不认为split_first_mut
和split_last_mut
是完成此任务的工具。我是要简化实现,并改为切换到remove
和pop
来使其编译:
fn spiral_order(mut matrix: Vec<Vec<i32>>) -> Vec<i32> {
if matrix.is_empty() {
return Vec::new();
}
let mut ans = Vec::with_capacity(matrix.len() * matrix[0].len());
while !matrix.is_empty() {
let mut head = matrix.remove(0);
ans.append(&mut head);
for row in matrix.iter_mut() {
ans.push(row.pop().unwrap());
}
if let Some(head) = matrix.pop() {
ans.extend(head.into_iter().rev());
}
}
ans
}
playground
matrix
突变或副本:
fn spiral_order(matrix: Vec<Vec<i32>>) -> Vec<i32> {
if matrix.len() == 0 || matrix[0].len() == 0 {
return Vec::new();
}
let mut row = 0;
let mut col = 0;
let mut up = 0;
let mut down = matrix.len() as i32 - 1;
let mut left = 0;
let mut right = matrix[0].len() as i32 - 1;
let mut dir = (0, 1);
let mut ans = Vec::with_capacity(matrix.len() * matrix[0].len());
for _ in 0..(matrix.len() * matrix[0].len()) {
ans.push(matrix[row as usize][col as usize]);
match dir {
(0, 1) if col == right => {
dir = (1, 0);
up += 1;
}
(1, 0) if row == down => {
dir = (0, -1);
right -= 1;
}
(0, -1) if col == left => {
dir = (-1, 0);
down -= 1;
}
(-1, 0) if row == up => {
dir = (0, 1);
left += 1;
}
_ => (),
}
row += dir.0;
col += dir.1;
}
ans
}
playground
关于multidimensional-array - 为什么这没有通过借阅检查器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65854559/
Perl6 Twitter 模块提供了一个多维变量,其中包含来自搜索查询的推文。这段代码: %tweets[0].say; %tweets[0].say; 打印: es Fri May 04 13:5
只是好奇这是否是在D中初始化动态多维数组的最佳实践。他们的语言引用中有关于数组的部分,但是我不确定它是否超出了我要完成的工作。 class Map { Tile[][] tiles;
我在 golang 中为二维数组使用以下简单代码,其中 APPEND 函数导致重复值而不是追加。 package main import "fmt" func main() { var n i
我刚刚构建了我的第一个 LED 立方体,想稍微扩展一下测试代码。为了寻址我的 3x3x3 立方体的每个 LED,我想使用相应的三维数组,但我在初始化时遇到了错误。 这是我做的: int cube_ma
我需要求解一个线性方程组 Lx=b,其中 x 始终是一个向量(3x1 数组),L 是一个 Nx3 数组,而 b 是一个 Nx1 向量。 N 通常在 4 到 10 之类的范围内。我使用解决这个问题没有问
我有几个问题: 1、isoMDS和cmdscale有什么区别? 2. 我可以使用非对称矩阵吗? 3. 有没有办法确定最佳维度数(结果)? 最佳答案 MDS 方法之一是 distance scaling
我目前正在学习数据库类(class)。之前在看一些关系型数据库的视频,在做研究的时候,碰巧遇到了这个多维索引的话题。出于好奇,我试着读了一点,但我并不完全理解它在说什么,因为它似乎是一个非常高级的话题
这有点复杂;我欢迎就如何提高问题的清晰度提出任何意见。 好的,假设我有一个数组: real, allocatable :: A(:,:,:) 我想在使用它之前分配它。第三维的大小是否可能取决于第二维的
我有一个动态的 3d 数字数组,目前我正在像在 C 中那样做: for (auto i = 0; i < size; i++) { for (auto j = 0; j < size; j++
我最初有一个空矩阵: m = Matrix(0, 3) 和我要添加的行: v = [2,3] 我尝试这样做: [m v] 但我得到一个错误 ERROR: ArgumentError: number
我想知道从文件中读取的几个矩阵的维数。我已经编写了代码来计算矩阵的行数和元素总数,因此知道列数,将元素总数除以行数。 program matrix implicit none inte
假设我有一个多维数组: logic [7:0] mda [7:0]; 我现在要做的是将 mda[7:4] 分配给输出端口,即定义如下: output [31:0] odata; 当然,我可以使用连接来
想象一个菱形等距图,它基本上是一个以 (x,y) 坐标和顶部单元格为原点的二维数组,如单元格中所标记: 我想按以下顺序从后到前遍历这些单元格: 通过未知的同侧 map 以这种方式循环的算法是什么? 预
我无法弄清楚如何在矩阵中的矩阵中获取矩阵的长度(嵌套深度为 3)。所以简而言之,代码所做的是......看看发布者是否已经在数组中,然后它要么在数组中添加一个新列,其中包含一个新的发布者和相应的系统,
我是 Java8 的新手,无法使用流将一个数组映射到另一个二维数组。 我有一个二维数组,它是一种模式: boolean[][] pattern = { {true, true,
m = [] 初始化一个维度为1的空数组。我想初始化一个维度为2的空数组(稍后将在其上附加值。这可能吗? 最佳答案 尝试: m = reshape([],0,2) 要么, m = Array{Floa
如何在Cuda的设备内存中分配和传输2D阵列(与主机之间)? 最佳答案 我找到了解决该问题的方法。我不必弄平阵列。 内置的cudaMallocPitch()功能可以完成这项工作。我可以使用cudaMe
我指的是ndarray crate 以及assert_approx_eq。 我的问题:assert_approx_eq等是否存在类似ndarray::Array2的东西? 目前我正在做: for it
我试图通过逐行拆分顶部和底部行来解决leetcode上的螺旋顺序问题,但我遇到了我无法理解的借位检查器问题。这是产生编译错误的最小示例: pub fn f(mut matrix: &mut [Vec]
我想执行一个循环操作,该操作将执行以下操作(操作必须逐个元素地进行)。 let mut spec = array![] // matrix mxn let exponencial = array![]
我是一名优秀的程序员,十分优秀!