邓俊辉 算法训练营练习 - 数字盒子

/*数字盒子
问题描述
你有一个盒子,你可以往里面放数,也可以从里面取出数。

初始时,盒子是空的,你会依次做 Q 个操作,操作分为两类:

插入操作:询问盒子中是否存在数 x,如果不存在则把数 x 丢到盒子里。
删除操作:询问盒子中是否存在数 x,如果存在则取出 x。
对于每个操作,你需要输出是否成功插入或删除。

输入
第一行一个正整数 Q,表示操作个数。

接下来 Q 行依次描述每个操作。每行 2 个用空格隔开的非负整数 op,x 描述一个操作:op 表示操作类型,op=1 则表示这是一个插入操作,op=2 则表示这是一个删除操作;x 的意义与操作类型有关,具体见题目描述。

输出
按顺序对所有操作输出,对于每个操作输出一行,如果成功则输出“Succeeded”(不含引号),如果失败则输出“Failed”(不含引号)。

样例输入
6
1 100
1 100
2 100
1 200
2 100
2 200
样例输出
Succeeded
Failed
Succeeded
Succeeded
Failed
Succeeded*/

#include <bits/stdC++.h>
using namespace std;
/*将long long定义为ll 方便书写*/
typedef long long ll;
const int mod = 1000003;//取模的大小微 1000003

vector<ll> table[mod];//记录数字取模后的位置
/*返回x取模mod的值*/
int Hash(ll x){
  return x % mod;
}
//函数判断插入 或 删除是否成功
bool operate(int op,ll x){
  int h = Hash(x);//h代表数字在table中的位置
  vector<ll>::iterator ptr = table[h].end();//end()返回最后一个元素的下一个位置
  /*循环遍历找出这个元素是否存在*/
  for(vector<ll>::iterator i = table[h].begin();i != table[h].end();++i)
    //如果找出 ptr = i
    if(*i == x){
      ptr = i;
      break;
    }
  /*插入操作*/
  if(op == 1){
    if(ptr == table[h].end())//上一个for循环遍历没有找到x时ptr仍然是table[h].end()
    {
      table[h].push_back(x);
      return 1;
    }
    return 0;
  }else{//删除操作
    if(ptr != table[h].end()){//判断后存在此元素
      //将要删除元素位置的元素改为最后一个元素  再删除最后一个位置的元素
      *ptr = table[h].back();
      table[h].pop_back();
    }
  }
}
int main(int argc, char const *argv[]) {
  int Q;
  scanf("%d",&Q);
  int op;
  ll x;
  for(int i = 0;i < Q;i++){
    scanf("%d%lld",&op,&x);
    puts(operate(op,x)?"Succeeded":"Failed");//如果operate = 1返回Succeeded
  }
  return 0;
}

s

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值