核心思路:
1.len表示单词长度,head表示我单词开头的位置,之后这个单词位置为head+len
2.我每次查询的时候就查询head-head+len-1这个区间就好了
3、如果按照题目描述 用循环数组去做代码很长,可读性并不高
完整代码:
#include<bits/stdc++.h>
using namespace std;
const int N = 1010;
int h[N],idx,len; //h表示内存用来存储单词,idx表示单词开始的位置,len表示当前我的内存里的单词数量
int main(){
int n,m; cin >> m >> n; // m内存,n单词数量
int cnt = 0; // 查询字典的次数
while(n--){
int w; cin >> w; // 输入单词
int i = idx; // 起始位置是当前的开头
for(i; i < idx+len; i++){ // 如果在之前的内存中查询到我当前的单词,直接结束,不加cnt
if(h[i] == w) break;
}
if(i == idx+len){ //如果没有在之前的内存中查询到我当前的单词
if(len == m){ //如果我当前的这个单词已经超出内存
h[idx+len] = w; //当前单词的位置等于:开头+单词长度=现存单词的位置
idx++; //把开头位置向后移动一位,相当于删除了第一个单词
}else {
h[idx+len] = w;
len++; //如果没有超出限制len每来一个单词我的单词长度加一
}
cnt ++; //每次新存进单词表示查询了一次,cnt++;
}
}
cout << cnt << endl;
return 0;
}