【问题标题】:getting a reference binding to misaligned address error for LeetCode problem Max Frequency Stack为 LeetCode 问题 Max Frequency Stack 获取未对齐地址错误的引用绑定
【发布时间】: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++


【解决方案1】:

看起来不错!

就在pop()中,我们可以简单地先保存top,然后我们将stack.pop()递减(如果堆栈不为空)然后返回top

// This block might trivially optimize the exec time;
// Can be removed;
static const auto __optimize__ = []() {
    std::ios::sync_with_stdio(false);
    std::cin.tie(NULL);
    return 0;
}();


// Most of headers are already included;
// Can be removed;
#include <cstdint>
#include <unordered_map>
#include <stack>
#include <algorithm>

static const struct FreqStack {
    using SizeType = std::uint_fast16_t;
    FreqStack() {}
    std::unordered_map<SizeType, SizeType> frequencies;
    std::unordered_map<SizeType, std::stack<SizeType>> mapstack;
    SizeType max_fr = 0;

    const void push(const int x) {
        max_fr = std::max(max_fr, ++frequencies[x]);
        mapstack[frequencies[x]].push(x);
    }


    const int pop() {
        const auto& top = mapstack[max_fr].top();
        mapstack[max_fr].pop();

        if (mapstack[frequencies[top]--].empty()) {
            --max_fr;
        }

        return top;
    }

};

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-17
    • 2015-04-27
    相关资源
    最近更新 更多