1401:机器翻译(详细过程)

核心思路:

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;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值