题目描述:实现 FreqStack,模拟类似栈的数据结构的操作的一个类。
FreqStack 有两个函数:
- push(int x),将整数 x 推入栈中。
- pop(),它移除并返回栈中出现最频繁的元素。
如果最频繁的元素不只一个,则移除并返回最接近栈顶的元素。
代码实现
```java
class FreqStack {
// 记录 FreqStack 中元素的最大频率
private int maxFreq = 0;
// 记录 FreqStack 中每个 val 对应的出现频率,后文就称为 VF 表
private HashMap<Integer, Integer> valToFreq = new HashMap<>();
// 记录频率 freq 对应的 val 列表,后文就称为 FV 表
private HashMap<Integer, Stack
public FreqStack() {
}
public void push(int val) {
//1. 计算每个元素出现的频率
int frequency = this.valToFreq.getOrDefault(val, 0);
frequency++;
this.valToFreq.put(val, frequency);
//2. 计算最大频率
maxFreq = maxFreq >= frequency ? maxFreq : frequency;
//3. 计算频率对应元素栈
Stack<Integer> valStack = this.freqToVals.getOrDefault(frequency, new Stack<>());
valStack.add(val);
this.freqToVals.put(frequency, valStack);
}
public int pop() {
//1. 取出弹出元素
int val = this.freqToVals.get(maxFreq).pop();
//2. 重新计算当前元素频率
int frequency = this.valToFreq.get(val);
frequency--;
this.valToFreq.put(val, frequency);
//3. 当前频率已经没有元素了,需要重新计算最大频率
if (this.freqToVals.get(maxFreq).isEmpty()) {
maxFreq = frequency;
}
return val;
}
}
```