【发布时间】:2019-12-14 03:17:28
【问题描述】:
这是一个简单的算法练习。问题是返回第一个非重复字符。例如,我有这个字符串:'abbbcdd',答案是'a',因为'a' 出现在'c' 之前。如果没有找到任何重复的字符,它将返回'_'。
我的解决方案工作正常,但我的问题是关于性能。问题陈述说:“编写一个只迭代字符串一次并使用 O(1) 额外内存的解决方案。”
这是我的代码:
console.log(solution('abbbcdd'))
function solution(str) {
let chars = buildCharMap(str)
for (let i in chars) {
if (chars[i] === 1) {
return i
}
}
return '_'
}
function buildCharMap(str) {
const charMap = {}
for (let i = 0; i < str.length; i++) {
!charMap[str[i]] ? charMap[str[i]] = 1 : charMap[str[i]]++
}
return charMap
}
我的答案是否满足空间复杂度的要求?
【问题讨论】:
-
构建字符映射是
O(N),因为你正在循环你的字符串,它的长度可以是N。不是O(1)。除非你知道字符串长度总是长度不变 -
O(1)是不可能的,因为你必须遍历字符串的每个字符以某种方式,所以最坏的情况是你必须至少执行n操作,其中n是字符串的长度 -
它说 O(1) 额外的内存。它说空间限制必须是 O(1),而不是运行时间。这意味着您不能将字符串的副本存储在变量等中。空间复杂度与时间复杂度不同
-
@sinanspd 回文?
-
这实际上取决于有关您未包含在问题中的问题的更多详细信息。字符串是否由固定大小的字母组成(例如,只有小写字母)?如果是这样,对象的辅助空间是 O(1),而不是 O(n)。
标签: javascript performance big-o space-complexity