[力扣竞赛] 第 274 场周赛
5967. 检查是否所有 A 都在 B 之前
给你一个 仅 由字符 ‘a’ 和 ‘b’ 组成的字符串 s 。如果字符串中 每个 ‘a’ 都出现在 每个 ‘b’ 之前,返回 true ;否则,返回 false 。
提示:
1 <= s.length <= 100s[i]为'a'或'b'
解题
字符串中只有a b两种字符,js 中 indexOf 可以找到字符的下标,寻找 a的下标,如果不存在,根据示例3可返回应直接返回 true。当a存在时,如果 index > 0,说明a必然在b的中间;如果 index = 0,那么去掉它继续判断a的下标,直到得到结果。
提交
/** |
5968. 银行中的激光束数量
银行内部的防盗安全装置已经激活。给你一个下标从 0 开始的二进制字符串数组 bank ,表示银行的平面图,这是一个大小为 m x n 的二维矩阵。 bank[i] 表示第 i 行的设备分布,由若干 '0' 和若干 '1' 组成。'0' 表示单元格是空的,而 '1' 表示单元格有一个安全设备。
对任意两个安全设备而言,如果同时 满足下面两个条件,则二者之间存在 一个 激光束:
两个设备位于两个 不同行 :r1 和 r2 ,其中 r1 < r2 。
满足 r1 < i < r2 的 所有 行 i ,都 没有安全设备 。
激光束是独立的,也就是说,一个激光束既不会干扰另一个激光束,也不会与另一个激光束合并成一束。
返回银行中激光束的总数量。
提示:
m == bank.lengthn == bank[i].length1 <= m, n <= 500bank[i][j] 为 '0' 或 '1'
解题
根据题目,可知设备只会和最近的行内的设备产生激光,且同行内部不会产生激光,所以去掉空行之后只需要依次计算相邻两行的激光数并相加即可。
提交
通过一次筛选找到有设备的行后进行遍历,将相邻的两行传入 countLine 函数计算结果并记录
/** |
计算任意两行之间的激光数
function countLine(r1,r2) { |
5969. 摧毁小行星
给你一个整数 mass ,它表示一颗行星的初始质量。再给你一个整数数组 asteroids ,其中 asteroids[i] 是第i颗小行星的质量。
你可以按 任意顺序 重新安排小行星的顺序,然后让行星跟它们发生碰撞。如果行星碰撞时的质量 大于等于 小行星的质量,那么小行星被 摧毁 ,并且行星会 获得 这颗小行星的质量。否则,行星将被摧毁。
如果所有小行星 都 能被摧毁,请返回 true ,否则返回 false 。
提示:
1 <= mass <= 1051 <= asteroids.length <= 1051 <= asteroids[i] <= 105
解题
提示中出现了十万量级的数据,猜测遍历排序后再循环会超时;考虑不排序碰撞,如果可以吸收就增加初始重量mass,当无法吸收时记录它,返回无法吸收的数组;把新的重量以及无法吸收的行星再次碰撞,直到吸收干净(返回 true)或者两次无法吸收的数组长度相同(无法完全吸收 返回false)
提交
新建个数组记录下次碰撞的行星
func asteroidsDestroyed(mass int, asteroids []int) bool { |
撞 tmd
func crash(mass *int, wait []int) []int { |
巧的是这题还没人用 go 解

这题是先用 js 写了之后感觉传参太麻烦有用 go 重写了,发现内存的消耗差距很大

附一下 js 的代码
/** |






