华为OD机试 C++【内存冷热标记】

该博客介绍了一种基于内存页访问频次的冷热标记方案,用于优化计算机存储系统。首先,通过读取访存序列和阈值,使用HashMap统计每个内存页的访问次数。接着,遍历HashMap,识别并记录访问次数大于等于阈值的热内存页。最后,输出热内存页的数量及其按访问频次降序排列的页框号。

题目

现代计算机系统中通常存在多级的存储设备,针对海量 workload 的优化的一种思路是将热点内存页优先放到快速存储层级,这就需要对内存页进行冷热标记。
一种典型的方案是基于内存页的访问频次进行标记,如果统计窗口内访问次数大于等于设定阈值,则认为是热内存页,否则是冷内存页。
对于统计窗口内跟踪到的访存序列和阈值,现在需要实现基于频次的冷热标记。内存页使用页框号作为标识。

输入描述
第一行输入为 N,表示访存序列的记录条数,0 < N ≤ 10000。
第二行为访存序列,空格分隔的 N 个内存页框号,页面号范围 0 ~ 65535,同一个页框号可能重复出现,出现的次数即为对应框号的频次。
第三行为热内存的频次阈值 T,正整数范围 1 ≤ T ≤ 10000。

输出描述
第一行输出标记为热内存的内存页个数,如果没有被标记的热内存页,则输出 0 。

如果第一行 > 0,则接下来按照访问频次降序输出内存页框号,一行一个,频次一样的页框号,页框号小的排前面。

用例

输入	
10
1 2 1 2 1 2 1 2 1 2
5
输出	
2
1
2
说明	内存页1和内存页2均被访问了5次,达到了阈值5,因此热内存页有2个。内存页1和内存页2的访问频次相等,页框号小的排前面。
输入
5
1 2 3 4 5
3
输出
0
说明	访存跟踪里面访存频次没有超过3的,因此热内存个数为0。

解题思路

1、统计内存页的访问频次:

  • 使用一个HashMap来记录每个内存页的访问次数
### 华为ODC++考点与练习 华为OD中,C++作为一门重要的编程语言,其考点覆盖了基础语法、数据结构、算法设计以及代码优化等多个方面。以下是C++华为OD中的主要考点和相关题目练习[^1]。 #### 1. C++基础语法 C++的基础语法是考察的重点之一,包括变量声明、数据类型、运算符、控制结构等。例如: - **变量与数据类型**:熟悉`int`、`float`、`double`、`char`等基本数据类型的使用。 - **运算符**:掌握算术运算符、关系运算符、逻辑运算符的优先级及用法。 - **控制结构**:熟练使用`if-else`、`switch-case`、`for`、`while`等语句进行程序逻辑控制。 示例代码: ```cpp #include <iostream> using namespace std; int main() { int a = 10, b = 20; if (a > b) { cout << "a is greater than b" << endl; } else { cout << "b is greater than or equal to a" << endl; } return 0; } ``` #### 2. 函数与指针 函数和指针是C++的核心概念之一,也是中常见的考点。 - **函数定义与调用**:掌握函数参数传递(值传递、引用传递)、返回值类型等。 - **指针操作**:理解指针的基本概念及其在内存管理中的应用。 示例代码: ```cpp #include <iostream> using namespace std; void swap(int* a, int* b) { int temp = *a; *a = *b; *b = temp; } int main() { int x = 5, y = 10; swap(&x, &y); cout << "x: " << x << ", y: " << y << endl; return 0; } ``` #### 3. 面向对象编程 C++支持面向对象编程(OOP),这是华为OD的重要部分。 - **类与对象**:熟悉类的定义、成员函数、构造函数、析构函数等。 - **继承与多态**:掌握继承制、虚函数、多态性的实现。 示例代码: ```cpp #include <iostream> using namespace std; class Animal { public: virtual void sound() { cout << "Animal makes a sound" << endl; } }; class Dog : public Animal { public: void sound() override { cout << "Dog barks" << endl; } }; int main() { Animal* animal = new Dog(); animal->sound(); // 输出 "Dog barks" delete animal; return 0; } ``` #### 4. 数据结构与算法 华为ODC++的数据结构和算法要求较高,以下是一些常见考点: - **数组与字符串**:数组的操作、字符串处理(如子串查找、反转字符串等)。 - **链表**:单链表、双链表的创建、遍历、插入、删除等操作。 - **栈与队列**:栈和队列的基本操作及应用场景。 - **排序与查找**:快速排序、归并排序、二分查找等经典算法。 示例代码(快速排序): ```cpp #include <iostream> using namespace std; void quickSort(int arr[], int left, int right) { if (left >= right) return; int pivot = arr[(left + right) / 2]; int i = left, j = right; while (i <= j) { while (arr[i] < pivot) i++; while (arr[j] > pivot) j--; if (i <= j) { swap(arr[i], arr[j]); i++; j--; } } if (left < j) quickSort(arr, left, j); if (right > i) quickSort(arr, i, right); } int main() { int arr[] = {5, 3, 8, 6, 2}; int n = sizeof(arr) / sizeof(arr[0]); quickSort(arr, 0, n - 1); for (int i = 0; i < n; i++) { cout << arr[i] << " "; } return 0; } ``` #### 5. STL库的应用 C++标准模板库(STL)提供了丰富的容器、算法和函数,能够简化代码编写。以下是常用的部分: - **容器**:`vector`、`list`、`map`、`set`等。 - **算法**:`sort`、`find`、`reverse`等。 示例代码: ```cpp #include <iostream> #include <vector> #include <algorithm> using namespace std; int main() { vector<int> vec = {5, 3, 8, 6, 2}; sort(vec.begin(), vec.end()); for (auto num : vec) { cout << num << " "; } return 0; } ``` ### 练习建议 为了更好地准备华为OD,建议通过以下方式提升C++能力: 1. 使用在线OJ平台(如LeetCode、牛客网等)进行刷题,选择C++语言进行练习。 2. 针对自己薄弱的知识点进行专项训练,逐步提高。 3. 模拟真实考环境,限时完成题目以锻炼解题速度和准确性[^2]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AlgorithmHero

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值