内存冷热标记 - 华为OD统一考试(C卷)

OD统一考试(C卷)

分值: 100分

题解: Java / Python / C++

alt

题目描述

现代计算机系统通常存在多级的存储设备,针对海量的 wordload 的优化的一种思路是将热点内存页优化先放到快速存储层级,这就需要对内存页进行冷热标记。

一种典型的方案是基于内存页的访问频次进行标记,如果统计窗口内访问次数大于等于设定阈值,要实现基于频次的冷热标记。内存页使用页框号作为标识。

输入描述

第一行输入为 N, 表示访存序列的记录条数, 0 < N ≤ 10000。

第二行为访问内存序列,空格间隔的 N 个内存页框号,页面号范围 0 ~ 65535,同一个页框号可能重复出现,出现的次数即为对应框号的频次。

第三行为热内存的频次阈值 T ,正整数范围 1 ≤ T ≤ 10000。

输出描述

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

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

示例1

输入:
10
1 2 1 2 1 2 1 2 1 2
5输出:
2
1
2说明:
内存页 1 和内存页 2 均被访问了5 次,达到了阈值5 ,因此热内存页有2个。内存页1 和内存页 2 的访问频次相等,页框号小的排前面。

示例2

输入:
5
1 2 3 4 5
3输出:
0说明:
从访问跟踪里面访问频次没有超过 3 的,因此热内存个数为 0。

题解

这道题目首先需要统计每个内存页的访问频次,然后根据设定的阈值判断是否为热内存。接着,需要按照访问频次降序进行排序,同时对于频次相同的内存页,要按照页框号升序排序。

以下是解题思路的详细步骤:

  1. 使用一个Map(Java和Python)或者unordered_map(C++)来统计每个内存页的访问频次。键为页框号,值为对应的频次。
  2. 遍历输入的内存访问序列,更新频次统计。
  3. 遍历频次统计,将频次大于等于设定阈值的内存页加入一个列表。
  4. 对列表进行自定义排序,首先按照访问频次降序排序,然后在频次相同的情况下按照页框号升序排序。
  5. 输出结果,首先输出热内存的个数,然后按照排序后的顺序输出内存页框号。

Java

import java.util.*;
/*** @author code5bug*/
public class Main {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);int n = scanner.nextInt();// 内存页访问次数Map<Integer, Integer> cnt = new HashMap<>();for (int i = 0; i < n; i++) {int x = scanner.nextInt();cnt.put(x, cnt.getOrDefault(x, 0) + 1);}int t = scanner.nextInt();// 热内存(频次大于等于阈值的内存页)List<Map.Entry<Integer, Integer>> vcnt = new ArrayList<>();for (Map.Entry<Integer, Integer> entry : cnt.entrySet()) {if (entry.getValue() >= t) {vcnt.add(entry);}}// 自定义排序Collections.sort(vcnt, (a, b) -> {if (!a.getValue().equals(b.getValue())) {return Integer.compare(b.getValue(), a.getValue());} else {return Integer.compare(a.getKey(), b.getKey());}});// 打印结果System.out.println(vcnt.size());for (Map.Entry<Integer, Integer> entry : vcnt) {System.out.println(entry.getKey());}}
}

Python

from collections import defaultdictn = int(input())# 内存页访问次数
cnt = defaultdict(int)
for x in map(int, input().split()):cnt[x] += 1t = int(input())# 热内存(频次大于等于阈值的内存页)
vcnt = [(key, value) for key, value in cnt.items() if value >= t]# 自定义排序
vcnt.sort(key=lambda x: (-x[1], x[0]))# 打印结果
print(len(vcnt))
for key, _ in vcnt:print(key)

C++

#include <bits/stdc++.h>
using namespace std;int main()
{int n, t;cin >> n;// 内存页访问次数unordered_map<int, int> cnt;for (int i = 0, x; i < n; i++) {cin >> x;cnt[x]++;}cin >> t;// 热内存(频次大于等于阈值的内存页)vector<pair<int, int>> vcnt;for (auto it : cnt) {if (it.second >= t) {vcnt.push_back(it);}}// 自定义排序sort(vcnt.begin(), vcnt.end(), [](pair<int, int> a, pair<int, int> b) {if (a.second != b.second) {return a.second > b.second;} else {return a.first < b.first;}});// 打印结果cout << vcnt.size() << endl;for (auto it : vcnt) {cout << it.first << endl;}return 0;
}

‍❤️‍华为OD机试面试交流群每日真题分享): 加V时备注“华为od加群”

🙏整理题解不易, 如果有帮助到您,请给点个赞 ‍❤️‍ 和收藏 ⭐,让更多的人看到。🙏🙏🙏

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/512183.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【vue/组件封装】封装一个带条件筛选的搜索框组件(多组条件思路、可多选)详细流程

引入&#xff1a;实现一个带有筛选功能的搜索框&#xff0c;封装成组件&#xff1b; 搜索框长这样子&#xff1a; 点击右侧筛选图标后弹出层&#xff0c;长这样子&#xff1a; 实际应用中有多组筛选条件&#xff0c;这里为了举栗子就展示一组&#xff1b; 预览&#xff1a;…

ES核心概念(45-48)(56-62)(101-103)

ES集群 ES集群&#xff08;Cluster&#xff09;包含多个节点&#xff08;服务器&#xff09;&#xff0c;整体提供服务 核心概念 索引Index&#xff1a;类似于mysql中的表 映射Mapping:数据的结构信息 文档&#xff1a;相当于表中的一条记录 分片&#xff1a; 将数据分成多片…

010-原型链

原型链 1、概念2、原理3、new 操作符原理4、应用 1、概念 原型链&#xff1a;javascript的继承机制&#xff0c;是指获取JavaScript对象的属性会顺着其_proto_的指向寻找&#xff0c;直至找到Object.prototype上。 2、原理 &#x1f4a1; Tips&#xff1a;构造函数 Fn&#…

Day12-【Java SE进阶】JDK8新特性:Lambda表达式、方法引用、常见算法、正则表达式、异常

一、JDK8新特性 1.Lambda表达式 Lambda表达式是JDK 8开始新增的一种语法形式;作用:用于简化名内部类的代码写法。 注意:Lambda表达式并不是说能简化全部匿名内部类的写法&#xff0c;只能简化函数式接口的匿名内部类。 有且仅有一个抽象方法的接口。注意:将来我们见到的大部…

电商直播大屏是什么?想搞这个怎么做?

随着电商行业的快速发展&#xff0c;直播带货已成为当下最热门的市场营销方式之一。为了更好地掌握直播数据&#xff0c;为企业决策提供有力支持&#xff0c;电商直播数据大屏应运而生。 一、电商直播数据大屏概述 电商直播数据大屏是一种集成了多种数据源的大屏幕可视化展示…

C if...else 语句

一个 if 语句 后可跟一个可选的 else 语句&#xff0c;else 语句在布尔表达式为 false 时执行。 语法 C 语言中 if…else 语句的语法&#xff1a; if(boolean_expression) {/* 如果布尔表达式为真将执行的语句 */ } else {/* 如果布尔表达式为假将执行的语句 */ }如果布尔表…

主流抠图算法trimap-based/free

GitHub - JizhiziLi/matting-survey: Deep Image Matting: A Comprehensive SurveyDeep Image Matting: A Comprehensive Survey. Contribute to JizhiziLi/matting-survey development by creating an account on GitHub.https://github.com/JizhiziLi/matting-survey数据集介…

C语言文件操作,linux文件操作,文件描述符,linux下一切皆文件,缓冲区,重定向

目录 C语言文件操作 如何打开文件以及打开文件方式 读写文件 关闭文件 Linux系统下的文件操作 open 宏标志位 write&#xff0c;read&#xff0c;close&#xff0c;lseek接口 什么是当前路径&#xff1f; linux下一切皆文件 文件描述符 文件描述符排序 C语言文件操…

【更新2022】各省数字经济水平测算 原始数据+结果 2011-2022

数据说明&#xff1a;参照赵涛等&#xff08;2020&#xff09;的文章&#xff0c;利用熵值法和主成分对省市数字经济水平进行测算&#xff0c;原始数据来自第五期北大数字普惠金融指数&#xff0c;含原始数据&#xff0c;以及熵值法、主成分两种测算结果。一、数据介绍 数据名…

【EI会议征稿通知】第七届交通运输与土木建筑国际学术论坛(ISTTCA 2024)

第七届交通运输与土木建筑国际学术论坛&#xff08;ISTTCA 2024&#xff09; 2024 7th International Symposium on Traffic Transportation and Civil Architecture 交通运输是经济发展的先行官&#xff0c;而岩土是发展交通运输网络无法避开的话题。将传统的土木工程技术与先…

python爬虫之Appium 的使用

Appium 是一个跨平台移动端自动化测试工具&#xff0c;可以非常便捷地为 iOS 和 Android 平台创建自动化测试用例。它可以模拟 App 内部的各种操作&#xff0c;如点击、滑动、文本输入等&#xff0c;只要我们手工操作的动作 Appium 都可以完成。在前面我们了解过 Selenium&…

DiffusionMat:Alpha Matting as sequential refinement learning

1.introduction DiffusionMat的基本思想是未知区域的抠图可以逐步改进&#xff0c;并从每一次的迭代的反馈中受益&#xff0c;纠正和细化结果。 2.related works Segdiff、BitDiffusion、DiffusionDet、 3.Approach 通过一种新颖的校正策略将trimap引导转化为精确的alpha m…