Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
什么';对于矩阵的相邻单元计数,这个解决方案有什么问题?(Swift)_Swift_Algorithm_Matrix - Fatal编程技术网

什么';对于矩阵的相邻单元计数,这个解决方案有什么问题?(Swift)

什么';对于矩阵的相邻单元计数,这个解决方案有什么问题?(Swift),swift,algorithm,matrix,Swift,Algorithm,Matrix,我被交给了一个快速操场来解决这个问题。我被告知我的答案是正确的,但还不够好(没错,相当模糊) /* 写一个包含nxn个整数网格的快速操场。每个整数可以是1或0。 然后,游乐场输出一个nxn网格,其中每个块表示该块周围的1的数量(不包括块本身)。对于第0行的块0,周围的块是(0,1)(1,0)和(1,1)。与块体(1,1)类似,其周围的所有块体均应计为周围块体。 要求: 确保您的解决方案适用于任何大小的网格。 花一个半小时编写逻辑,再花一个小时清理代码(添加注释、清理变量和函数名)。 将函数优化为

我被交给了一个快速操场来解决这个问题。我被告知我的答案是正确的,但还不够好(没错,相当模糊)

/*
写一个包含nxn个整数网格的快速操场。每个整数可以是1或0。
然后,游乐场输出一个nxn网格,其中每个块表示该块周围的1的数量(不包括块本身)。对于第0行的块0,周围的块是(0,1)(1,0)和(1,1)。与块体(1,1)类似,其周围的所有块体均应计为周围块体。
要求:
确保您的解决方案适用于任何大小的网格。
花一个半小时编写逻辑,再花一个小时清理代码(添加注释、清理变量和函数名)。
将函数优化为O(n^2)。
输出行不应有任何尾随或前导空格。
请使用下面的硬编码输入常量示例。
示例:
输入网格:
让sampleGrid=[[0,1,0],[0,0,0],[1,0,0]]
控制台输出:
1 0 1
2 2 1
0 1 0
/////////////////
输入网格:
设sampleGrid=[[0,1,0,0],[0,0,0,1],[1,0,0,1],[0,1,0,1]]
控制台输出:
1 0 2 1
2 2 3 1
1 2 4 2
2 1 3 1
*/
///一个*错误*类型
结构计算错误:错误{
///错误信息
让消息:字符串
}
///此函数根据输入*矩阵计算矩阵结果*
///其中,整数值表示相邻单元格的数量
///在具有1的输入*矩阵*中。
///
///如果n是矩阵的边长,则算法为O(n^2):
///
///对于矩阵行中的每一行
///对于矩阵列中的每列
///对于每个矩阵[行][列]单元,如果等于1
///将1添加到结果矩阵中的相邻(有效)单元格
///
///-参数矩阵:仅输入值为0或1的平方矩阵
///-返回:与输入矩阵大小相等的矩阵,具有计算的邻接值
///-Throws:Throws计算错误是矩阵大小无效或值无效(1或0以外的值)
func compute(矩阵:[[Int]])抛出->[[Int]]{
//矩阵中的行数,应等于列数,即边长或n
let side=matrix.count
//返回的结果矩阵
变量结果:[[Int]]=[]
//初始化结果矩阵

对于u0..他们可能在寻找函数式编程风格的东西,您可能需要证明您的解决方案是O(n^2)

例如:

 // let sampleGrid = [[0,1,0], [0,0,0], [1,0,0]]
 let sampleGrid = [[0,1,0,0], [0,0,0,1], [1,0,0,1],[0,1,0,1]]

 func printMatrix(_ m:[[Any]])
 {
    print( m.map{ $0.map{"\($0)"}.joined(separator:" ")}.joined(separator:"\n") )
 }

 let emptyLine  = [Array(repeating:0, count:sampleGrid.first!.count)]

 let left  = sampleGrid.map{ [0] + $0.dropLast()  }   // O(n)
 let right = sampleGrid.map{ $0.dropFirst() + [0] }   // O(n)
 let up    = emptyLine + sampleGrid.dropLast()        // O(n)
 let down  = sampleGrid.dropFirst() + emptyLine       // O(n)

 let leftRight   = zip(left,right).map{zip($0,$1).map{$0+$1}} // O(n^2)
 let upDown      = zip(up,down).map{zip($0,$1).map{$0+$1}}    // O(n^2)

 let cornersUp   = emptyLine + leftRight.dropLast()   // O(n)
 let cornersDown = leftRight.dropFirst() + emptyLine  // O(n)

 let sides   = zip(leftRight,upDown).map{zip($0,$1).map{$0+$1}}      // O(n^2)
 let corners = zip(cornersUp,cornersDown).map{zip($0,$1).map{$0+$1}} // O(n^2)

 // 6 x O(n) + 5 x O(n^2) ==> O(n^2)
 let neighbourCounts = zip(sides,corners).map{zip($0,$1).map{$0+$1}}  // O(n^2) 

 print("SampleGrid:")
 printMatrix(sampleGrid)
 print("\nNeighbour counts:")
 printMatrix(neighbourCounts)


代码评论应该发布在,而不是这里。请在发布之前删除此帖子。并且在发布之前确保您的问题符合他们的标准。感谢您的建议。我已经这样做了。我会在Alain在那里回复他的答案后立即删除此问题。这里的链接是:我不能删除此问题,该网站禁止回答得很好,但我正按照建议将问题转移到codereview stackexchange。请将您的答案转发到那里。这里是链接:顺便说一句,他们写的是O(n^2),但应该是O(n),其中n是矩阵中元素的数量,而不是它的边。因为他们将矩阵定义为nxn,所以在这种情况下,他们的参考点实际上是n=边的边
 // let sampleGrid = [[0,1,0], [0,0,0], [1,0,0]]
 let sampleGrid = [[0,1,0,0], [0,0,0,1], [1,0,0,1],[0,1,0,1]]

 func printMatrix(_ m:[[Any]])
 {
    print( m.map{ $0.map{"\($0)"}.joined(separator:" ")}.joined(separator:"\n") )
 }

 let emptyLine  = [Array(repeating:0, count:sampleGrid.first!.count)]

 let left  = sampleGrid.map{ [0] + $0.dropLast()  }   // O(n)
 let right = sampleGrid.map{ $0.dropFirst() + [0] }   // O(n)
 let up    = emptyLine + sampleGrid.dropLast()        // O(n)
 let down  = sampleGrid.dropFirst() + emptyLine       // O(n)

 let leftRight   = zip(left,right).map{zip($0,$1).map{$0+$1}} // O(n^2)
 let upDown      = zip(up,down).map{zip($0,$1).map{$0+$1}}    // O(n^2)

 let cornersUp   = emptyLine + leftRight.dropLast()   // O(n)
 let cornersDown = leftRight.dropFirst() + emptyLine  // O(n)

 let sides   = zip(leftRight,upDown).map{zip($0,$1).map{$0+$1}}      // O(n^2)
 let corners = zip(cornersUp,cornersDown).map{zip($0,$1).map{$0+$1}} // O(n^2)

 // 6 x O(n) + 5 x O(n^2) ==> O(n^2)
 let neighbourCounts = zip(sides,corners).map{zip($0,$1).map{$0+$1}}  // O(n^2) 

 print("SampleGrid:")
 printMatrix(sampleGrid)
 print("\nNeighbour counts:")
 printMatrix(neighbourCounts)
SampleGrid:
0 1 0 0
0 0 0 1
1 0 0 1
0 1 0 1

Neighbour counts:
1 0 2 1
2 2 3 1
1 2 4 2
2 1 3 1