Fork me on GitHub

华为机考复盘

A.设计一种虚拟机解释器,解析并执行以下虚拟指令。

输入:若干行,每行一条指令

输出:对输入的每行指令,若为PRINT指令,则输出打印一行,该行中包括一个整数,表示寄存器的值

#include <bits/stdc++.h>
using namespace std;
vector<int> dst(32,0);//32位整型寄存器
int main(){
    string s;
    while(getline(cin,s)){
        stringstream ss(s);
        vector<string> order;
        string t;
        while(ss >> t){
			order.push_back(t);
        }
        if(order[0]=="MOV"){
            if(order[2][0]=='a'){
				dst[order[1][1]-'0']=dst[order[2][1]-'0'];
            }else{
                dst[order[1][1]-'0']=stoi(order[2]);
            }
        }else if(order[0]=="ADD"){
            int num1 =0;
            int num2 =0;
            if(order[2][0]=='a'){
				num1 = dst[order[2][1]-'0'];
            }else{
                num1 = stoi(order[2]);
            }
            if(order[3][0]=='a'){
                num2 = dst[order[3][1]-'0'];
            }else{
                num2 = stoi(order[3]);
            }
            dst[order[1][1]-'0']=num1+num2;
        }else if(order[0]=="SUB"){
            int num1 =0;
            int num2 =0;
            if(order[2][0]=='a'){
				num1 = dst[order[2][1]-'0'];
            }else{
                num1 = stoi(order[2]);
            }
            if(order[3][0]=='a'){
                num2 = dst[order[3][1]-'0'];
            }else{
                num2 = stoi(order[3]);
            }
            dst[order[1][1]-'0']=num1-num2;
        }else if(order[0]=="MUL"){
            int num1 =0;
            int num2 =0;
            if(order[2][0]=='a'){
				num1 = dst[order[2][1]-'0'];
            }else{
                num1 = stoi(order[2]);
            }
            if(order[3][0]=='a'){
                num2 = dst[order[3][1]-'0'];
            }else{
                num2 = stoi(order[3]);
            }
            dst[order[1][1]-'0']=num1*num2;
        }else if(order[0]=="DIV"){
            int num1 =0;
            int num2 =0;
            if(order[2][0]=='a'){
				num1 = dst[order[2][1]-'0'];
            }else{
                num1 = stoi(order[2]);
            }
            if(order[3][0]=='a'){
                num2 = dst[order[3][1]-'0'];
            }else{
                num2 = stoi(order[3]);
            }
            dst[order[1][1]-'0']=num1/num2;
        }else if(order[0]=="PRINT"){
            cout << dst[order[1][1]-'0']<<endl;
        }
    }
}

B.无线通信移动性需要在基站上配置邻区(本端基站的小区LocalCell与周边邻基站的小区NeighborCelI映射)关系,为了能够加速无线算法的计算效率,设计一个邻区关系缓存表,用于快速的通过本小区LocalCell查询到邻小区NeighborCell。但是缓存表有一定的规格限制,因此到达规格并且需要插入新的数据时,需要删除邻区数据,选择删除邻区数据对象的策略为:

(1)使用次数最少的;LFU

(2)如果(1)返回有多个对象,则选择最久未使用的。LRU

哈希表用以查找元素和判断当前缓存表是否满,同时判断写入的元素是否存在当前缓存表中

红黑树set用以对当前缓存表的元素进行排序,按照使用次数或使用时间,便于在缓存表满的时候写入新元素时删除元素

#include <bits/stdc++.h>

using namespace std;

//定义复合数据结构
struct Node{
    int cnt;//表示节点被访问的次数
    int tim;// 表示节点最近一次被访问的时间
    int key;//节点的键,标识缓存项
    int value;//节点的值,缓存项的数据内容
    Node() {}
    Node(int a,int b,int c, int d):cnt(a),time(b),key(c),value(d){}
    bool operator < (const Node& nod) const{//定义'<'运算符重载函数,用于比较两个'Node'对象的大小
        return cnt == nod.cnt? tim < nod.tim : cnt < nod.cnt;
    }
};
int n;//确定缓存容量
int tim=0;
unordered_map<int,Node> mapp;//实现快速查找
set<Node> S;//红黑树实现元素按照(cnt,time)排序,用以删除最少使用或最少使用且最久未使用的缓存项

//读取元素
int get(int key){
	if(n==0 || mapp.find(key)==mapp.end()){
        return -1;
    }
    Node cache = mapp[key];
    S.erase(cache);
    cache.cnt ++;
    cache.tim = ++tim;
    S.insert(cache);
    mapp[key] = cache;
    return cache.value;
}
//写入元素
void put(int key, int value){
    if(n == 0) return;
    auto it = mapp.find(key);
    if(it == mapp.end()){//当前元素不存在于缓存表中
        if(mapp.size() == n){//删除哈希表和红黑树中使用次数最小或者使用次数最小且最久未使用的元素
            mapp.erase(S.begin()->key);
            S.erase(S.begin());
        }
        Node cache = Node(1,++tim,key,value);
        mapp[key] = cache;
        S.insert(cache);
    }else{//缓存表中已存在该元素
        Node cache = it->second;
        S.erase(cache);
        cache.cnt += 1;
        cache.tim = ++tim;
        cache.value = value;
        S.insert(cache);
        it->second = cache;
    }
}

int main(){
    string s;
    cin >> s;
    cin >> n;
    int x;
    while(cin >> s){
        if(s[0]=='w'){
			int m;
            cin >> m;
            while(m--){
				int a,b;
                cin >> a >> b;
                put(a,b);
            }
        }else if(s[0]=='r'){
            cin >> x;
            get(x);
        }else while(cin >> x){
            if(mapp.count(x)) cout << mapp[x].value<< endl;
            else cout << -1 <<endl;
        }
    }
}
posted @ 2024-05-13 20:55  bupaanything  阅读(102)  评论(0)    收藏  举报
1