【发布时间】:2020-09-22 14:55:49
【问题描述】:
所以问题是要实现一个最大频率堆栈,它将始终弹出最大频率元素,如果频率相同,则最接近顶部的那个将被弹出。现在我尝试实现一个堆栈映射,其中每个频率计数都映射到包含具有该频率的元素的堆栈。
我面临的主要问题是这个错误:
第 157 行:字符 16:运行时错误:引用绑定到未对齐的地址 0xbebebebebebebec0ba,类型为“int”,需要 4 字节对齐 (stl_deque.h) 0xbebebebebebec0ba:注意:指针指向这里 摘要:UndefinedBehaviorSanitizer:未定义行为 /usr/bin/../lib/gcc/x86_64-linux-gnu/8/../../../../include/c++/8/bits/stl_deque.h :162:16
失败的测试用例:
["FreqStack","push","push","push","push","push","push","pop","push","pop","push","pop","push","pop","push","pop","pop","pop","pop","pop","pop"]
[[],[4],[0],[9],[3],[4],[2],[],[6],[],[1],[],[1],[],[4],[],[],[],[],[],[]]
我无法理解其原因。我已经搜索了关于 SO 的其他问题,该错误似乎是由于未初始化的变量或越界访问造成的。但我似乎并没有真正找到我的代码中出现这个问题的地方。
这是我的代码:
class FreqStack {
public:
unordered_map<int,int>freq;
unordered_map<int,stack<int>>st;
int maxfreq=0;
FreqStack() {
}
void push(int x) {
maxfreq=max(maxfreq,++freq[x]);
st[freq[x]].push(x);
}
int pop() {
if(st[maxfreq].size()==0)
maxfreq--;
int t=st[maxfreq].top();
st[maxfreq].pop();
return t;
}
};
/*
* Your FreqStack object will be instantiated and called as such:
* FreqStack* obj = new FreqStack();
* obj->push(x);
* int param_2 = obj->pop();
*/
任何帮助将不胜感激。
谢谢:D
【问题讨论】:
-
我不介意打赌
maxfreq在您的pop例程中会变成负数。添加支票很容易。 -
好的,所以我在逻辑上和使用编译器检查了代码,但似乎并非如此。此外,maxfreq 只有在 pop() 命令在空堆栈上调用时才会变为负数,LC 表示不会发生。还有为什么投反对票??
-
好吧,我没有给你投反对票,但我想这是因为我们喜欢看到一些有这类问题的数据。如果你能提供一些重现问题的数据,那么它应该很容易解决,否则就很难解决。
-
添加了测试用例
-
我不理解您尝试的算法,但失败很明显。在
int t=st[maxfreq].top();行中,堆栈有时为空,这会导致您看到的失败。我能够简化测试用例,以下序列产生相同的错误push(4), push(4), pop(), push(4), pop(), pop()。
标签: c++