我在实习面试中无法解决一个合乎逻辑的练习。对我来说太复杂了。您能帮我解释一下如何解决吗? (我没有通过,但是我真的很想知道如何解决它)。练习是:
”给出一个字符串数组arr,通过计算所有岛屿的总周长来完成功能landPerimeter。每块土地都将标有“ X”,而水场则表示为“ O”。一块完美的1 x 1块土地。一些示例可以更好地可视化: ['XOOXO', 'XOOXO', 'OOOXO', 'XXOXO', 'OXOOO']
在此处查看图片:https://i.ibb.co/pbDwWSs/pic1.jpg
应返回:“陆地总周长:24”,
而
['XOOO',
'XOXO',
'XOXO',
'OOXX',
'OOOO']
在此处查看图片:https://i.ibb.co/Pcdy8Ct/pic2.jpg
应返回:“陆地总周长:18”
请您显示代码示例,我该如何解决此练习。 非常感谢你!
答案 0 :(得分:-1)
请参阅此链接find-perimeter-shapes-formed-1s-binary-matrix。需要根据您的情况进行一些小的修改。见下文
<script>
function numOfNeighbour( mat, i, j,rows,cols)
{
var count = 0;
// UP
if (i > 0 && mat[i - 1][j]==='X')
count++;
// LEFT
if (j > 0 && mat[i][j - 1]==='X')
count++;
// DOWN
if (i < rows-1 && mat[i + 1][j]==='X')
count++;
// RIGHT
if (j < cols-1 && mat[i][j + 1]==='X')
count++;
return count;
}
function findPerimeter( mat)
{
var perimeter = 0;
var rows=mat.length;
var cols=mat[0].length;
// Traversing the matrix and finding ones to
// calculate their contribution.
for (var i = 0; i < rows; i++)
for (var j = 0; j < cols; j++)
if (mat[i][j] && mat[i][j]==='X')
perimeter += (4 - numOfNeighbour(mat, i ,j,rows,cols));
return perimeter;
}
console.log("perimeter of ['XOOXO', 'XOOXO', 'OOOXO', 'XXOXO', 'OXOOO'] is ",findPerimeter(['XOOXO', 'XOOXO', 'OOOXO', 'XXOXO', 'OXOOO'])); //24
console.log("perimeter of ['XOOO', 'XOXO', 'XOXO', 'OOXX', 'OOOO'] is " ,findPerimeter(['XOOO', 'XOXO', 'XOXO', 'OOXX', 'OOOO'])); //18
</script>