有一个给定的2d图像阵列,如下所示。 我需要找到0'z的开始和结束索引以及宽度和高度。
我已经按照以下方式实现了我的方法,但是我想知道如何才能更有效地实现这种方法,或者只需很少的行代码。 Javascript或快速解决方案都可以。
零总是形成一个矩形或正方形。
var image: [[Int]] =
[
[1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 0, 0, 0, 1],
[1, 1, 1, 0, 0, 0, 1],
[1, 1, 1, 1, 1, 1, 1]
]
func findZeros (input : [[Int]]) -> (x : Int, y: Int, width:Int, height:Int)
{
var x = 0;
var y = 0;
var width = 0;
var total = 0;
var isWidthSet = false;
for row in 0...input.count-1
{
if width != 0
{
isWidthSet = true
}
for column in 0...input[row].count-1
{
if input[row][column] == 0
{
if (x == 0 && y == 0)
{
x = row
y = column
}
total += 1
if isWidthSet == false
{
width += 1
}
}
}
}
return (x,y,width,total/width)
}
print(findZeros(input:image))
答案 0 :(得分:0)
我用indexOf
和lastIndexOf
避免了嵌套循环的50美分:
function findProps(image) {
var p = {x1: -1, y1: -1, x2: -1, y2: -1};
for (var t = 0; t <= image.length >> 1;) {
p.x1 = image[t].indexOf(0);
p.x2 = image[t].lastIndexOf(0);
if (!~p.y1 && ~p.x1) p.y1 = t;
var r = image.length - ++t;
if (!~p.y2 && ~image[r].indexOf(0)) p.y2 = r;
if (~p.y1 && ~p.y2) break;
}
p.exists = !!(~p.x1 && ~p.y1 && ~p.x2 && ~p.y2);
p.width = p.exists + p.x2 - p.x1,
p.height = p.exists + p.y2 - p.y1;
return p;
}
var img = [
[1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 0, 0, 0, 1],
[1, 1, 1, 0, 0, 0, 1],
[1, 1, 1, 1, 1, 1, 1]
];
console.log(findProps(img))