3 solutions

  • 6
    @ 2024-7-11 10:58:30

    太简单了

    提示:内存数组开大一点

    代码

    #include <bits/stdc++.h>
    using namespace std;
    int a[1005],front,back;
    int m,n,cnt;
    void push(int x){
    	a[back++] = x;
    }
    void pop(){
    	a[front++] = -1;
    }
    bool find(int x){
    	for (int i = front;i < back;i++){
    		if (a[i] == x)	return 1;
    	}
    	return 0;
    }
    int main(int argc, char **argv){
    	memset(a,0xff,sizeof(a));
    	cin >> m >> n;
    	for (int i = 0;i < n;i++){
    		int x;
    		cin >> x;
    		if (!find(x)){
    			push(x);
    			cnt++;
    			if (back - front > m)	pop();
    		}
    	}
    	cout << cnt;
    	return 0;
    }
    
    • 3
      @ 2024-7-17 20:40:53

      利用一个队列来记录进如内存的先后顺序,利用set来查找内存中是否有当前单词

      #include<iostream>
      #include<string>
      #include<cmath>
      #include<set>
      #include<queue>
      using namespace std;
      int n,m,a[10001];
      set <int> s;
      queue <int>q;
      int main()
      {
      	int sum=0;
      	cin >> m >> n;		//m表示储存空间,n表示文章长度 
      	for (int i=1;i<=n;i++){
      		int x;
      		cin >> x;
      		if (!s.count(x)){	//如果字典中有直接调用,如果没有将新单词存入 
      			sum++;			//记录查词次数 
      			if (s.size()==m){			//如果空间已满 
      				s.erase(q.front());		//弹出队列第一项(最早查询的词)并同步弹出set的这一项 
      				q.pop();
      			}
      			q.push(x);		// 单词加入内存 
      			s.insert(x);	//单词加入内存 
      		}
      	}
      	cout << sum;
       }
      
      • 1
        @ 2024-7-17 20:08:52

        数组模拟队列代码

        提示:样例中有0,最好全部重置为-1

        #include<bits/stdc++.h>
        using namespace std;
        int q[10005],a[1005],cnt,m,n;//题目所需(数组模拟队列) 
        bool isin(int x){//is in:是否在队列里 
        	for(int i=0;i<m;i++){//在前m个数中(即内存)寻找 
        		if(q[i]==x)return true; //若存在返回true 
        	}
        	return false;//否则返回false 
        }
        void push(int x){
        	int sum=0;
        	for(int i=0;i<m;i++){
        		if(q[i]!=-1)sum++;//已经被占用的内存量 
        	}
        		if(sum==m){//若内存已满 
        			for(int i=1;i<m;i++){
        				q[i-1]=q[i];//从第二个到第m个整体前移 
        			}
        			q[m-1]=x;//末位补为x 
        		}
        		else{
        			q[sum]=x;//否则内存量的下一位补为x 
        		}
        	
        }
        int main(){
        	memset(q,-1,sizeof(q));
        	cin>>m>>n;
        	for(int i=0;i<n;i++){
        		cin>>a[i];
        	}
        	for(int i=0;i<n;i++){
        		if(!isin(a[i])){
        			push(a[i]);
        			cnt++;
        		}
        	}
        	//push(6);
        	cout<<cnt<<endl;
        	/*for(int i=0;i<m;i++){
        		cout<<q[i]<<' ';
        	}*/
        	return /*164*/0;
        }
        
        • 1

        Information

        ID
        532
        Time
        1000ms
        Memory
        125MiB
        Difficulty
        2
        Tags
        # Submissions
        101
        Accepted
        29
        Uploaded By