5967. 检查是否所有 A 都在 B 之前

给你一个 仅 由字符 ‘a’ 和 ‘b’ 组成的字符串 s 。如果字符串中 每个 ‘a’ 都出现在 每个 ‘b’ 之前,返回 true ;否则,返回 false 。

提示:

  • 1 <= s.length <= 100
  • s[i]'a''b'

解题

字符串中只有a b两种字符,js 中 indexOf 可以找到字符的下标,寻找 a的下标,如果不存在,根据示例3可返回应直接返回 true。当a存在时,如果 index > 0,说明a必然在b的中间;如果 index = 0,那么去掉它继续判断a的下标,直到得到结果。

提交

/**
* @param {string} s
* @return {boolean}
*/
var checkString = function(s) {
let a_i = 0
const str = [...s]
while (a_i===0 && a_i < s.length) {
a_i = str.indexOf('a')
if (a_i > 0) {
return false
}
str.shift()
}
return true
};

5968. 银行中的激光束数量

银行内部的防盗安全装置已经激活。给你一个下标从 0 开始的二进制字符串数组 bank ,表示银行的平面图,这是一个大小为 m x n 的二维矩阵。 bank[i] 表示第 i 行的设备分布,由若干 '0' 和若干 '1' 组成。'0' 表示单元格是空的,而 '1' 表示单元格有一个安全设备。

对任意两个安全设备而言,如果同时 满足下面两个条件,则二者之间存在 一个 激光束:

两个设备位于两个 不同行 :r1 和 r2 ,其中 r1 < r2
满足 r1 < i < r2 的 所有 行 i ,都 没有安全设备 。
激光束是独立的,也就是说,一个激光束既不会干扰另一个激光束,也不会与另一个激光束合并成一束。

返回银行中激光束的总数量。

提示:

  • m == bank.length
  • n == bank[i].length
  • 1 <= m, n <= 500
  • bank[i][j] 为 '0' 或 '1'

解题

根据题目,可知设备只会和最近的行内的设备产生激光,且同行内部不会产生激光,所以去掉空行之后只需要依次计算相邻两行的激光数并相加即可。

提交

通过一次筛选找到有设备的行后进行遍历,将相邻的两行传入 countLine 函数计算结果并记录

/**
* @param {string[]} bank
* @return {number}
*/
var numberOfBeams = function(bank) {
const _bank = bank.filter(v => {
return v.indexOf('1') >= 0
})
let sum = 0
_bank.reduce((pre, cur, index, arr) => {
pre = [...pre]
cur = [...cur]
sum += countLine(pre, cur)
return cur
}, '')
return sum
};

计算任意两行之间的激光数

function countLine(r1,r2) {
const _r1 = r1.filter(v => v === '1').length
const _r2 = r2.filter(v => v === '1').length
return _r1 * _r2
}

5969. 摧毁小行星

给你一个整数 mass ,它表示一颗行星的初始质量。再给你一个整数数组 asteroids ,其中 asteroids[i] 是第i颗小行星的质量。

你可以按 任意顺序 重新安排小行星的顺序,然后让行星跟它们发生碰撞。如果行星碰撞时的质量 大于等于 小行星的质量,那么小行星被 摧毁 ,并且行星会 获得 这颗小行星的质量。否则,行星将被摧毁。

如果所有小行星 都 能被摧毁,请返回 true ,否则返回 false

提示:

  • 1 <= mass <= 105
  • 1 <= asteroids.length <= 105
  • 1 <= asteroids[i] <= 105

解题

提示中出现了十万量级的数据,猜测遍历排序后再循环会超时;考虑不排序碰撞,如果可以吸收就增加初始重量mass,当无法吸收时记录它,返回无法吸收的数组;把新的重量以及无法吸收的行星再次碰撞,直到吸收干净(返回 true)或者两次无法吸收的数组长度相同(无法完全吸收 返回false

提交

新建个数组记录下次碰撞的行星

func asteroidsDestroyed(mass int, asteroids []int) bool {
_wait := asteroids
for len(_wait) > 0 {
wait := crash(&mass, _wait)
if len(wait) == len(_wait) {
return false
}
_wait = wait
}
return true
}

撞 tmd

func crash(mass *int, wait []int) []int {
_wait := make([]int, 0)
for i := 0; i < len(wait); i++ {
if *mass >= wait[i] {
*mass += wait[i]
} else {
_wait = append(_wait, wait[i])
}
}
return _wait
}

巧的是这题还没人用 go 解

golang

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

javaScript

附一下 js 的代码

/**
* @param {string[]} bank
* @return {number}
*/
var numberOfBeams = function(bank) {
const _bank = bank.filter(v => {
return v.indexOf('1') >= 0
})
let sum = 0
_bank.reduce((pre, cur, index, arr) => {
pre = [...pre]
cur = [...cur]
sum += countLine(pre, cur)
return cur
}, '')
return sum
};

function countLine(r1,r2) {
const _r1 = r1.filter(v => v === '1').length
const _r2 = r2.filter(v => v === '1').length
return _r1 * _r2
}