C++中第一个唯一数字


假设我们有一个整数队列,我们需要检索该队列中的第一个唯一整数。我们必须实现一个名为FirstUnique的类:它将由队列中的数字初始化。定义一个函数showFirstUnique(),它将返回队列中第一个唯一整数的值,如果不存在这样的整数则返回-1。另一个方法是add(value),它将值插入到队列中。

所以,如果输入是这样的

  • 用[2,3,4]初始化,然后按如下方式调用函数:

  • showFirstUnique()

  • add(5)

  • showFirstUnique()

  • add(2)

  • showFirstUnique()

  • add(3)

  • showFirstUnique()

那么输出将分别是2、2、3、-1。

为了解决这个问题,我们将遵循以下步骤:

  • 定义一个队列q

  • 定义一个映射cnt

  • 初始化器将接收数组

    • 对于nums中的每个元素i

      • (将cnt[i]增加1)

    • 对于nums中的每个元素i

      • 如果cnt[i]等于1,则:

        • 将i插入到q中

  • 定义一个函数showFirstUnique()

  • 当(q不为空且cnt[q的第一个元素] > 1)时,执行:

    • 从q中删除元素

  • 返回(如果q为空,则返回-1,否则返回q的第一个元素)

  • 定义一个函数add(),它将接收值,

  • (将cnt[value]增加1)

  • 如果cnt[value]等于1,则:

    • 将value插入到q中

示例

让我们看看下面的实现,以便更好地理解:

在线演示

#include <bits/stdc++.h>
using namespace std;
class FirstUnique {
public:
   queue <int> q;
   map <int, int> cnt;
   FirstUnique(vector<int>& nums) {
      for (int i : nums) {
         cnt[i]++;
      }
      for (int i : nums) {
         if (cnt[i] == 1) {
            q.push(i);
         }
      }
   }
   int showFirstUnique() {
      while (!q.empty() && cnt[q.front()] > 1) q.pop();
         return q.empty() ? -1 : q.front();
   }
   void add(int value) {
      cnt[value]++;
      if (cnt[value] == 1)
         q.push(value);
   }
};
main(){
   vector<int> v = {2,3,5};
   FirstUnique ob(v);
   cout << (ob.showFirstUnique()) << endl;
   ob.add(5);
   cout << (ob.showFirstUnique()) << endl;
   ob.add(2);
   cout << (ob.showFirstUnique()) << endl;
   ob.add(3);
   cout << (ob.showFirstUnique()) << endl;
}

输入

{2,3,5}
ob.showFirstUnique();
ob.add(5);
ob.showFirstUnique();
ob.add(2);
ob.showFirstUnique();
ob.add(3);
ob.showFirstUnique();

输出

2
2
3
-1

更新于:2020年11月17日

484 次浏览

开启您的职业生涯

完成课程获得认证

开始学习
广告
© . All rights reserved.