自学内容网 自学内容网

字符串长度

如果不给你数组长度,读入一个数组怎么半

int target;

std::cin.ignore();

string line;

std::getline(std::cin,line);

std::istringstream iss(line);
int temp1;
while(iss>>temp1)
{
    f.emplace_back(temp1);
}

题目1:输入,一个钱总数target,一行面值的钱

输出,凑成钱总数的最小个数

#include<iostream>
#include<string>
#include<vector>
//#include<sstream>
using namespace std;

int main()
{
int amount;
cin >> amount;
std::cin.ignore();
string line;

std::getline(std::cin, line);
//std::istringstream iss(line);

int temp = 0;
vector<int> f;
for (int i = 0; i < line.size(); i++) {
if (line[i] != ' ') temp = temp * 10 + (line[i] - '0');
else {
f.emplace_back(temp);
temp = 0;
} 
}
if (temp != 0) f.emplace_back(temp);


return 0;
}

二维背包方法

vector<vector<int>> dp(f.size()+1,vector<int>(amount+1,amount+1));
for (int i = 0; i <=f.size(); i++) {
dp[i][0] = 0;
}
//价值是1,重量是面值,背包容量是总数
for (int i = 1; i <=f.size();i++ )//遍历物品
{
for (int j = 1; j <= amount;j++)//遍历容量装//一般问题是最大能装多少东西,价值
{
dp[i][j] = min(dp[i][j], dp[i - 1][j]);
if (j-f[i-1]>=0) {
dp[i][j] = min(dp[i][j], dp[i][j-f[i-1]] + 1);
}

}
}
int result = dp[f.size()][amount]== amount + 1 ? -1 : dp[f.size()][amount];
cout << result;

一维背包方法

int minCoins(int target, const std::vector<int>& coins) {
    // 初始化 dp 数组,长度为 target + 1,初始值为 INT_MAX(表示无法凑成)
    std::vector<int> dp(target + 1, INT_MAX);
    dp[0] = 0; // 凑成 0 元需要 0 个硬币

    // 遍历从 1 到 target 的所有金额
    for (int amount = 1; amount <= target; ++amount) {
        // 对于每个金额,尝试每种硬币面值
        for (int coin : coins) {
            if (amount >= coin && dp[amount - coin] != INT_MAX) {
                dp[amount] = std::min(dp[amount], dp[amount - coin] + 1);
            }
        }
    }

    // 如果 dp[target] 仍然是 INT_MAX,说明无法凑成目标金额
    return dp[target] == INT_MAX ? -1 : dp[target];
}

 c++用久了,用一下c

fgets(s1,sizeof s1,stdin),'\0' 是 C 语言中的空字符(null character),也称作字符串终止符。它的 ASCII 值是 0,用来表示字符串的结束。(可把它代码写的简单坏了)

#include<stdio.h>
#include<string.h>

int count = 0;

char* vec(char* s1, char* s2) {
    char* p1, * p2;

    while (*s1 != '\0') {
        p1 = s1;
        p2 = s2;
        while (*p1 != '\0' && *p2 != '\0' && *p1 == *p2) {
            printf("%c %c ", *p1, *p2);
            p1++;
            p2++;
        }

        if (*p2 == '\0') {
            printf("%c %d ",*p2,count);
            count++;
        }
        s1++;
    }
    return s1;
}

int main() {
    char s1[100]; // 假设字符串的最大长度为100
    char s2[100];

    printf("请输入第一个字符串:");
    fgets(s1, sizeof(s1), stdin); // 读取第一个字符串

    // 去除 s1 中的换行符
    size_t len_s1 = strlen(s1);
    if (len_s1 > 0 && s1[len_s1 - 1] == '\n') {
        s1[len_s1 - 1] = '\0';
    }

    printf("请输入第二个字符串:");
    fgets(s2, sizeof(s2), stdin); // 读取第二个字符串

    // 去除 s2 中的换行符
    size_t len_s2 = strlen(s2);
    if (len_s2 > 0 && s2[len_s2 - 1] == '\n') {
        s2[len_s2 - 1] = '\0';
    }

   
    char* result = vec(s1, s2); // 调用 vec 函数

    printf("result: %d\n", count); //

    return 0;
}

笔试题目1

题目:虚拟指令执行
3题 请设计一种虚拟机解释器,能解析并执行以下虚拟指令。
虚拟机约定:32位整形寄存器:a0,a1...a31,共32个寄存器;整个虚拟机只有寄存器和立即数参与计算。
规则集 (dst一定为寄存器,src为寄存器或十进制正整数,运算结果存在负数场景):
1. MOV dst src
含义: dst =src
2. ADD dst src0 src1
含义:dst = src0 + src1
3. SUB dst src0 src1
含义:dst = src0 - src1
4. MUL dst src0 src1
含义: dst =srcO*src1
5.DIV dst src0 src1
含义: dst=src0/ src1 (结果向下取整)
6.PRINT dst
含义:打印dst寄存器值
约束:不用考虑计算溢出(用例保证),指令数最多100条,至少一条PRINT指令,寄存器保证先赋值再引用。不用考虑小数跟除0。

 思路:难点,

  • 1 循环输入怎么处理 while(std::getline(std::cin.line)),
  • 2 读进来后怎么处理读进来的字符串 istringstream iss(line)  iss>>command (会按照空格将字符串分成几部分)
  • 3 数据怎么存储 定义一个哈希表unordered_map<string,int>  registers,因为题目中说了就32个寄存器。
#include<iostream>
#include<unordered_map>
#include<string>
#include<sstream>
using namespace std;

class duixiang
{
public:
void hanshu(std::string line) {
std::istringstream iss(line);
string command;
iss >> command;
if (command == "MOV") {
string dst, src;
iss >> dst >> src;
jicunqi[dst] = getvalue(src);
}
else if (command == "ADD") {
string dst, src0, src1;
iss >> dst >> src0 >> src1;
jicunqi[dst] = getvalue(src0) + getvalue(src1);
}
else if (command == "SUB") {
string dst, src0, src1;
iss >> dst >> src0 >> src1;
jicunqi[dst] = getvalue(src0) - getvalue(src1);
}
else if (command == "MUL") {
string dst,src0, src1;
iss >> dst >> src0 >> src1;
jicunqi[dst] = getvalue(src0) * getvalue(src1);
}
else if (command == "DIV") {
string dst, src0, src1;
iss >> dst >> src0 >> src1;
jicunqi[dst] = getvalue(src0) / getvalue(src1);
}
else if (command == "PRINT") {
string dst;
iss >> dst;
cout << jicunqi[dst] << endl;
}

}
private:
unordered_map<string, int> jicunqi;
int getvalue(string s) {
if (s[0] >= 'a' && s[0] <= 'z') { return jicunqi[s]; }
return stoi(s);
}

};
int main()
{
duixiang duixiang1;
string line;
while (std::getline(std::cin, line)) {
duixiang1.hanshu(line);
}

return 0;
}

测试样例

MOV a1 100
MOV a2 200
ADD a3 a1 100
SUB a4 a3 a2
PRINT a4
0
MOV a1 100
MOV a2 200
PRINT a1
100
ADD a3 a1 100
SUB a4 a3 a2
PRINT a4

题目 2

无线基站邻区关系缓存表维护
天线通信移动性需要在基站上配置邻区 (本端基站的小区Localcel与周边邻基站的小区NerghorCell 关系,为了能够加速无线算法的十算效率,设计一个邻区关系缓存表,用于快速的通过本小区LocalCell查询邻小区Neigiborcel. 但是缓存表有一定的规格限制,因此到达规格井且需典插入新的5效周时,需要倒区数得,为释刚除区效对象的第略为:1) 便用次数是少的,2) 如果1) 返回有多个对象,则选样最久米使用的。
请设i计并实现一个满足以上要求的数据结构和算法实现。注:假设每个Localcel至多只有一个NeighborCel.
解答要求
时间限制:CIC++ 1000ms,其他语言:2000ms 内有限制粉: CIC++ 256MB,其他语言:512MB 

输入
1、首行以字符"capaily“标识设置一个型数容量;
2、以wille“标识开始进行若干组LocalCol, NeighborCell 3区数据的输入,每组数据为一行;如果”wite:"已经存在的LocalCel数据,更新其对应的NeighborCel, 并刷新使用时间和次数加、以'read“标识进行一次读取LocalCel的使用操作,刷新使用时间和次数1;
A、最后以'quey“标识查询输山保作,输入正型效Localcel, 查询NeighborCell;
注:
1) 写入和该现都表示对Locaicel的使用操作;
2) capaciy、LocalCelTNeighborCel是下型故,范国在(1, 10000);
3)输入的总行数不越过30000行,
输出
每个查询愉入正整数Loalce对应NeigilborCol, 表示在邻区关系彼行
表中的记录
1、找到,返NeighborCell;
2、没有找到,返回-1;
 

 思路:思想就是,用一个哈希表储存localcell和它的一些参数(一些参数定义了一个结构体)

然后由于要排序,所有定义了一个优先级队列(最大堆维护,它的排序函数与一般的排序反着来)

难点:优先级队列修改里面的值的话,不会参与到排列中,所以只能删除,重新插入。

指针指向同一个地址,可以修改指针中地址

#include <iostream>
#include <unordered_map>
#include <queue>
#include <vector>
#include <string>

using namespace std;

struct CacheEntry {
    int localCell;
    int neighborCell;
    int usageCount;
    int lastUsedTime;
    bool valid; // 标记缓存项是否有效

    CacheEntry(int lc, int nc, int time)
        : localCell(lc), neighborCell(nc), usageCount(0), lastUsedTime(time), valid(true) {}
};

struct Compare {
    bool operator()(const CacheEntry* a, const CacheEntry* b) const {
        if (a->usageCount == b->usageCount)
            return a->lastUsedTime > b->lastUsedTime; // 使用次数相同,比较最后使用时间
        return a->usageCount > b->usageCount; // 使用次数少的优先
    }
};

class Cache {
public:
    

    void write(int localCell, int neighborCell) {
        currentTime++;
        if (cacheMap.find(localCell) != cacheMap.end()) {
            CacheEntry* entry = cacheMap[localCell];
            entry->valid = false; // 标记旧的条目无效
        }

        if (cacheMap.size() == capacity && cacheMap.find(localCell) == cacheMap.end()) {
            evict(); // 淘汰缓存项
        }

        CacheEntry* newEntry = new CacheEntry(localCell, neighborCell, currentTime);
        cacheMap[localCell] = newEntry;
        cacheQueue.push(newEntry);

        // 打印当前计数时间
        cout << "当前计数时间: " << currentTime << endl;
        printQueueTop();
    }

   void read(int localCell) {
    if (cacheMap.find(localCell) == cacheMap.end()) {
        return;
    }
    CacheEntry* entry = cacheMap[localCell];
    entry->usageCount++;
    entry->lastUsedTime = ++currentTime;
    entry->valid = false; // 标记旧条目为无效

    CacheEntry* newEntry = new CacheEntry(localCell, entry->neighborCell, currentTime);
    newEntry->usageCount = entry->usageCount;
    cacheMap[localCell] = newEntry;
    cacheQueue.push(newEntry); // 插入更新后的条目
    printQueueTop();
}


    int query(int localCell) {
        if (cacheMap.find(localCell) != cacheMap.end()) {
            return cacheMap[localCell]->neighborCell;
        }
        else {
            return -1;
        }
    }

    void printCacheMap() const {
        for (const auto& pair : cacheMap) {
            cout << "LocalCell: " << pair.first
                << ", NeighborCell: " << pair.second->neighborCell
                << ", UsageCount: " << pair.second->usageCount
                << ", LastUsedTime: " << pair.second->lastUsedTime
                << endl;
        }
    }

    void printQueueTop() {
        cleanUpInvalidEntries(); // 清理无效条目
        if (!cacheQueue.empty()) {
            CacheEntry* top = cacheQueue.top();
            cout << "Queue Top -> LocalCell: " << top->localCell
                << ", NeighborCell: " << top->neighborCell
                << ", UsageCount: " << top->usageCount
                << ", LastUsedTime: " << top->lastUsedTime
                << endl;
        }
        else {
            cout << "Queue is empty" << endl;
        }
    }
    void fuzhicap(int cap) {
        capacity = cap;
        currentTime = 0;
    }

private:
    int capacity;
    int currentTime; // 用于模拟时间的自增计数器
    unordered_map<int, CacheEntry*> cacheMap;
    priority_queue<CacheEntry*, vector<CacheEntry*>, Compare> cacheQueue;

    void evict() {
        cleanUpInvalidEntries(); // 清理无效条目
        if (!cacheQueue.empty()) {
            CacheEntry* entry = cacheQueue.top();
            cacheQueue.pop();
            while (!entry->valid) {
                delete entry;
                if (cacheQueue.empty()) return;
                entry = cacheQueue.top();
                cacheQueue.pop();
            }
            if (cacheMap.find(entry->localCell) != cacheMap.end() && cacheMap[entry->localCell] == entry) {
                cacheMap.erase(entry->localCell);
                delete entry;
            }
        }
    }

    void cleanUpInvalidEntries() {
        // 清理优先级队列中无效的条目
        while (!cacheQueue.empty() && !cacheQueue.top()->valid) {
            delete cacheQueue.top();
            cacheQueue.pop();
        }
    }
};


int main() {
    Cache cache;
    string command;
    while (cin >> command) {
        if (command == "write") {
            int size;
            cin >> size;
            while (size--) {
                int localCell, neighborCell;
                cin >> localCell >> neighborCell;
                cache.write(localCell, neighborCell);
                cache.printQueueTop();
            }
            cache.printCacheMap();
        }
        else if (command == "read") {
            cache.printQueueTop();
            cache.printCacheMap();
            int localCell;
            cin >> localCell;
            cache.read(localCell);
            cache.printQueueTop();
            cache.printCacheMap();
        }
        else if (command == "query") {
            cache.printCacheMap();
            int localCell;
            cin >> localCell;
            cout << cache.query(localCell) << endl;
        }
        else if (command == "capacity") {
            // Handle capacity input
            int cap;
            cin >> cap;
            cache.fuzhicap(cap);
        }
    }

    return 0;
}

输入:

capacity
3
write
3
1 2
4 3
2 3
read
2
write
1
3 1
query
1

输出 -1

输入
capacity
4
write
5
3 5
1 2
4 3
2 3
5 4
read
4
read
1
read
2
read
5
write
1
6 1
query
1
输出2

字符串

 一线工程师每到重要节日需要对网络进行健康检查,在网络中对各个网元采集数据,判断当前网络是否健康。 因每个网元的判断条件以及采集的数据不同,现在需要你对网络采集到的数据,以及工程师提供的判断条件进行解析。判断条件为布尔表达式,保证合法,字段名不会与关键字冲突。 若采集数据符合条件,则认为网络健康,否则网络处于不健康状态。制 输入:32 error = '1' AND (name = 'NE40' OR name = 'NE20) error =2'AND (name ='NE40' OR ame ='NE20) error =3' AND (name ='NE40°OR name ='NE20) name NE40 error 3 复制输出:1 1 0.

sb题目

    error = '1' AND (name = 'NE40' OR name = 'NE20')
    error = '2' AND (name = 'NE40' OR name = 'NE20')
    error = '3' AND (name = 'NE40' OR name = 'NE20')
    name NE40
    error 3


原文地址:https://blog.csdn.net/zhangguojia7/article/details/139221694

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!