【发布时间】:2021-09-06 22:23:43
【问题描述】:
我该如何优化这个
如果字符串可以在没有余数的情况下拆分为 4、422 和 2222,则返回 true
测试:
- 输入“4”输出“真”(4)
- 输入“44”输出“真”(4 4)
- 输入 "42" 输出 false(4 2!==2222 || 422 || 4)
- 输入“4224224”输出真(422 422 4)
- 输入“42222”输出真(4 2222)
- 输入“22224”输出真(2222 4)
let solution = (password) => {
if (!password) return false
while (password) {
if (password.includes('2222')) {
while (password.includes('2222')) {
password = password.replace('2222', '')
}
}
if (password.includes('422')) {
while (password.includes('422')) {
password = password.replace('422', '')
}
}
if (password.includes('4')) {
while (password.includes('4')) {
password = password.replace('4', '')
}
}
return !!!password
}
}
console.log(solution('4'));
console.log(solution('44'));
console.log(solution('42'));
console.log(solution('4224224'));
console.log(solution('42222'));
console.log(solution('22224'));
这是一样的:
let solution = (password) => {
const searchValue = ['2222', '422', '4']
if (!password) return false
for (let elem = 0, i = searchValue[0]; password; elem++) {
if (password.includes(i)) {
while (password.includes(i)) {
password = password.replace(i, '')
}
}
i = searchValue[elem]
if (elem === 3) {
return !!!password
}
}
return !!!password
}
console.log(solution('4'));
console.log(solution('44'));
console.log(solution('42'));
console.log(solution('4224224'));
console.log(solution('42222'));
console.log(solution('22224'));
启动时的内存限制 - 100 MB
- 必须使用 ->
const bigStr = new Array(9999999).fill(() =>["4", "422", "2222" ][Math.floor(Math.random() * 3)]).map(f => f()).join('') - 对不起,我忘了说不允许使用正则表达式
【问题讨论】:
-
真正的问题是什么?您有 100 MB,此代码需要更少的内存。为什么
!!!password? -
返回!布尔值。 (密码) 可以等于 999999 个元素的字符串
-
我知道
!password和!!password但!!!password没有任何意义,尤其是当您想要优化时。它增加了两个不必要的操作。!password === !!!password -
我已经更新了我的解决方案。看一看。这是你想要的吗?
-
您的代码的空间复杂度是线性的
O(n),这只是因为您将输入字符串存储在一个变量中。否则复杂性将是恒定的O(1)。你需要2 * password.length + O(1)内存。你不能用 JavaScript 真正优化它。字符串是不可变的。您需要两个带有输入字符串的变量来修改字符串。 2 * 999999 个字符是 2 * 999999 个字节
标签: javascript string algorithm memory