题目 2125. 银行中的激光束数量
- 虽说是中等题,我觉得这题就是题目在吓人而已做起来应该是简单题;
银行内部的防盗安全装置已经激活。给你一个下标从 0 开始的二进制字符串数组 bank ,表示银行的平面图,这是一个大小为 m x n 的二维矩阵。 bank[i] 表示第 i 行的设备分布,由若干 '0' 和若干 '1' 组成。'0' 表示单元格是空的,而 '1' 表示单元格有一个安全设备。
思路
首先想到的思路是先统计每一行的1的数量
然后将非0行提取出来;
遍历这个非0行;将第一个*第二个,依次相加;
如果这个非0行长度为1;表示只有一行有安防,就不能与其他形成光束,return 0;
逻辑比较简单,代码写得不好;写完之后想去评论区看看有什么好的解法;
-
另一种求和的解法是想定义pre=ans[0];
-
其中在统计“1”的数量的时候代码写复杂了;
for i in bank:
cnt = i.count("1")
// 直接使用这个函数
从第二行开始:
之后不断更新 i 的同时不断更新pre
代码
class Solution:
def numberOfBeams(self, bank: List[str]) -> int:
# 判断下一个行有多少个1
li = [0]*len(bank)
sum = 0
ans = []
for i in range(len(bank)):
for j in range(len(bank[0])):
if bank[i][j]=="1":
li[i] += 1
for i in range(len(li)):
if li[i]!=0:
ans.append(li[i])
if len(ans)==1:
return 0
for i in range(len(ans)):
if i == len(ans)-1:
break
sum += ans[i]*ans[i+1]
return sum
更加简洁版本:
直接统计去掉0;不用后续处理
class Solution:
def numberOfBeams(self, bank: List[str]) -> int:
cnt_li = []
sum = 0
for i in bank:
cnt = i.count("1")
if cnt == 0:
continue
cnt_li.append(cnt)
for i in range(len(cnt_li)):
if i == len(cnt_li)-1:
break
sum += cnt_li[i]*cnt_li[i+1]
return sum