【Leetcode】NO.2125 银行的激光束数量(C++&Python)[周赛]

题目 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
上一篇:1582. 二进制矩阵中的特殊位置


下一篇:【Codeforces div3-498】题解