当前位置: 首页 > news >正文

【华为OD-E卷 - 整数编码 100分(python、java、c++、js、c)】

【华为OD-E卷 - 整数编码 100分(python、java、c++、js、c)】

题目

实现一种整数编码方法,使得待编码的数字越小,编码后所占用的字节数越小。
编码规则如下:
编码时7位一组,每个字节的低7位用于存储待编码数字的补码 字节的最高位表示后续是否还有字节,置1表示后面还有更多的字节,置0表示当前字节为最后一个字节。 采用小端序编码,低位和低字节放在低地址上。 编码结果按16进制数的字符格式输出,小写字母需转换为大写字母

输入描述

  • 输入的为一个字符串表示的非负整数

输出描述

  • 输出一个字符串,表示整数编码的16进制码流

备注

  • 待编码的数字取值范围为[0,1<<64 - 1]

用例

用例一:
输入:
0
输出:
00
用例二:
输入:
100
输出:
64
用例三:
输入:
1000
输出:
E807

说明 1000的二进制表示为0011 1110 1000,至少需要两个字节进行编码;

第一个字节最高位置1,剩余的7位存储数字1000的第一个低7位 (1101000),所以第一个字节的二进制为1110 1000,即E8;

第二个字节最高位置0,剩余的7位存储数字1000的第二个低7位 (0000111),所以第一个字节的二进制为0000 0111,即07;

采用小端序编码,所以低字节E8输出在前,高字节07输出在后。

python解法

  • 解题思路:
  • 该问题是将一个整数编码为变长的字节序列,其中每个字节的最高位是一个标志位,表示后续字节是否存在。具体来说,使用7位来表示数值,剩余的1位用作标志位来表示是否还有后续字节。每次编码后,若数值还大于等于128(即7位无法完全表示),则需要继续编码。最终返回的结果是这些字节的十六进制表示。

对于每个数值,取低7位作为当前字节的值(通过与0x7F按位与操作获得),然后将这个字节的最高位设为1(通过按位或操作),表示后续还有字节。
当数值变小到小于128时,停止编码,将其直接以十六进制格式返回

def encode_number(num):res = []  # 用于保存每个编码后的字节while num >= 128:  # 当数字大于等于128时,需要继续编码# 通过num & 0x7F 获取低7位,0x80表示设置字节的最高位为1res.append(f"{(num & 0x7F) | 0x80:02X}")  # 格式化为2位的十六进制数,添加到结果列表num >>= 7  # 将num右移7位,为编码下一段数值做准备# 最后一个字节,直接以低7位表示,无需设置最高位res.append(f"{num:02X}")  # 格式化为2位的十六进制数,添加到结果列表return "".join(res)  # 将所有字节拼接成一个字符串并返回# 输入整数,进行编码并输出结果
num = int(input())  # 从用户输入读取一个整数
print(encode_number(num))  # 调用encode_number函数进行编码,并打印结果

java解法

  • 解题思路
  • 该问题是将一个 long 类型的整数编码为变长的字节序列,其中每个字节的最高位是一个标志位,用来表示是否还有后续字节。每个字节的低7位用来表示数值的部分。根据编码规则,处理的过程如下:

每个字节的构成:
对于一个整数,将其分解为多个字节。每个字节表示 7 位数值,最高位(即第8位)用作标志位,表示后续是否还有字节。如果某个字节的最高位是 1,说明后面还有字节。如果是 0,表示这是最后一个字节。

过程:

将整数按 7 位拆分。
对于每个拆分出来的部分,设置其最高位为 1(表示后面还有字节)直到没有更多的数值需要编码。
当数值小于 128 时,设置该字节的最高位为 0,表示这是最后一个字节。
通过按位操作,逐步提取每个字节,并拼接结果。
编码输出:
编码后的结果是一个十六进制的字符串,表示每个字节

import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner in = new Scanner(System.in);  // 创建Scanner对象用于读取输入long val = in.nextLong();  // 读取一个long类型的数值Encoder enc = new Encoder();  // 创建Encoder对象System.out.println(enc.encode(val));  // 调用Encoder的encode方法,输出编码结果}
}class Encoder {// 编码方法:将long类型的val编码为变长字节序列public String encode(long val) {StringBuilder sb = new StringBuilder();  // 用于构建编码后的字符串boolean cont = true;  // 标志位,表示是否还需要继续编码// 当还需要继续编码时while (cont) {// 获取val的低7位,使用int类型保存,低7位用来表示字节的内容int num = (int) (val & 0x7F);val >>>= 7;  // 无符号右移7位,为下一次编码做准备// 如果val还有剩余的数值,则设置当前字节的最高位为1if (val != 0) {num |= 0x80;  // 设置最高位为1,表示后续还有字节} else {cont = false;  // 如果val已经处理完,停止编码}// 将当前字节num以2位大写十六进制格式添加到StringBuilder中sb.append(String.format("%02X", num));}return sb.toString();  // 返回编码后的十六进制字符串}
}

C++解法

  • 解题思路
  • 该问题的目标是将一个给定的 long long 类型整数编码成一个变长字节流,每个字节由7位数据和1位标志位组成。具体规则是:

字节格式:每个字节的最低7位用来存储数据,而最高1位用来作为标志位,表示是否还有后续字节。如果最高位为 1,表示还有更多字节;如果为 0,表示没有后续字节。
拆分流程:
将整数转换为二进制字符串。
按照每7位一组将其拆分。
对每一组数据,若不为最后一组,则设置最高位为 1,表示后续还有字节;否则,设置为 0,表示结束。
结果表示:将每个字节转为十六进制字符串,并拼接成最终的编码结果

#include <iostream>
#include <string>
#include <bitset>
#include <sstream>
#include <iomanip>using namespace std;// 将二进制字符串转换为十六进制字符串
string getHexString(const string &binStr) {int hexValue = stoi(binStr, nullptr, 2);  // 将二进制字符串转换为十进制整数stringstream ss;  // 创建字符串流// 将整数输出为十六进制格式,宽度为2,若不足两位前补零,且使用大写字母ss << hex << uppercase << setw(2) << setfill('0') << hexValue;return ss.str();  // 返回转换后的十六进制字符串
}// 获取结果,将long long类型的num转换为变长编码的十六进制字符串
string getResult(long long num) {// 将num转换为64位的二进制字符串string bin = bitset<64>(num).to_string();// 去掉二进制字符串前面的0,保留有效的二进制部分bin = bin.substr(bin.find('1')); stringstream ans;  // 用于保存编码后的十六进制结果int end = bin.length();  // 获取二进制字符串的长度// 按7位一组地处理二进制字符串while (end - 7 > 0) {// 获取当前的7位数据,并在其前面加上1,表示后面还有数据ans << getHexString("1" + bin.substr(end - 7, 7));  end -= 7;  // 更新剩余处理的二进制数据长度}// 处理最后不足7位的二进制数据if (end > 0) {ans << getHexString(bin.substr(0, end));  // 最后一个字节无需添加最高位的1}return ans.str();  // 返回编码后的十六进制字符串
}int main() {long long num;  // 定义long long类型的输入cin >> num;  // 读取输入的数字cout << getResult(num) << endl;  // 调用getResult函数并输出结果return 0;
}

C解法

  • 解题思路

更新中

JS解法

  • 解题思路

  • 这个问题是将一个大整数(通过字符串输入)编码为变长字节流,并返回其十六进制表示。每个字节包含7位数据和1位标志位。每个字节的标志位(最高位)用来指示是否还有后续字节,规则如下:

字节构成:

每个字节包含 7 位数据(低7位)和 1 位标志位(最高位)。
若当前字节的标志位为 1,表示后续还有字节需要编码;若为 0,表示当前字节是最后一个字节。
编码过程:

将输入的整数转为 BigInt 类型(处理大整数)。
使用 while 循环按 7 位拆分整数,并为每个字节设置标志位。
将所有字节转换为十六进制,并拼接成最终的结果。
输出:

返回变长编码的十六进制字符串,确保每个字节都以两位十六进制表示(不足两位前补零)

const readline = require("readline");  // 引入 readline 模块用于读取标准输入// 创建 readline 接口
const rl = readline.createInterface({input: process.stdin,  // 从标准输入读取output: process.stdout,  // 输出到标准输出
});// 监听每一行输入
rl.on("line", (line) => {console.log(encodeNumber(line));  // 每输入一行,调用encodeNumber进行编码并打印输出
});// 编码函数:将输入的数字(字符串形式)编码为变长字节流的十六进制字符串
function encodeNumber(numStr) {let num = BigInt(numStr);  // 将输入的字符串转为 BigInt 类型,支持大整数const result = [];  // 用于存储每个字节(编码后的字节)// 循环处理每个字节while (num > 0) {let byte = Number(num & 0x7Fn);  // 获取 num 的最低7位(即低7位),并将其转换为普通数字num >>= 7n;  // 将 num 右移 7 位,准备处理下一部分数据if (num > 0) {byte |= 0x80;  // 如果 num 仍然大于 0,说明后续还有字节,设置当前字节的最高位为1}result.push(byte);  // 将当前字节加入结果数组}// 处理 num 为 0 的情况if (result.length === 0) {result.push(0);  // 如果输入是0,结果数组中应该只有一个字节,值为0}// 将每个字节转换为十六进制字符串,并拼接成最终的结果return result.map(byte => byte.toString(16).padStart(2, '0').toUpperCase()).join("");
}

注意:

如果发现代码有用例覆盖不到的情况,欢迎反馈!会在第一时间修正,更新。
解题不易,如对您有帮助,欢迎点赞/收藏

相关文章:

【华为OD-E卷 - 整数编码 100分(python、java、c++、js、c)】

【华为OD-E卷 - 整数编码 100分&#xff08;python、java、c、js、c&#xff09;】 题目 实现一种整数编码方法&#xff0c;使得待编码的数字越小&#xff0c;编码后所占用的字节数越小。 编码规则如下: 编码时7位一组&#xff0c;每个字节的低7位用于存储待编码数字的补码 字…...

vue3 uniapp封装一个瀑布流组件

新增组件m-waterfall 这样就可以在页面直接使用 不用在引入了 <template><view class"m-waterfall"><view id"m-left-column" class"m-column"><slot name"left" :leftList"leftList"></slot&…...

Android Room 持久化库的介绍及使用方法

Android Room 是 Android Jetpack 组件之一&#xff0c;是 Google 官方推出的用于简化 SQLite 数据库操作的持久化库。它提供了一个抽象层&#xff0c;允许开发者在 SQLite 数据库上执行常见的 CRUD 操作&#xff0c;同时处理数据库连接、数据迁移和查询优化等底层细节。 Andr…...

Go语言中http.Transport的Keep-Alive配置与性能优化方法

在Go语言中&#xff0c;http.Transport是一个用于发送HTTP或HTTPS请求的客户端工具&#xff0c;它提供了许多可配置的参数以优化性能。其中&#xff0c;Keep-Alive配置是性能优化的关键部分。以下是对http.Transport的Keep-Alive配置与性能优化方法的详细解释&#xff1a; 一、…...

设计模式03:行为型设计模式之策略模式的使用情景及其基础Demo

1.策略模式 好处&#xff1a;动态切换算法或行为场景&#xff1a;实现同一功能用到不同的算法时和简单工厂对比&#xff1a;简单工厂是通过参数创建对象&#xff0c;调用同一个方法&#xff08;实现细节不同&#xff09;&#xff1b;策略模式是上下文切换对象&#xff0c;调用…...

C# 多线程 Task TPL任务并行

先总结一下 之前发展过程的要点 1&#xff1a; 为了保证多线程正确顺序执行 线程同步 2&#xff1a; 为了节省操作系统线程资源 线程池 异步 方式管理 正常来讲 使用这俩个要点 进行使用 多线程可以满足开发使用需求 但是 新的问题产生了 那就是 多个异步操作 需要编写大量的代…...

【matlab】matlab知识点及HTTP、TCP通信

1、矩阵运算 点乘&#xff1a;对于两个同维度的向量&#xff0c;点乘结果是这两个向量对应分量的乘积之和。 点除&#xff1a;是指对两个数组的对应元素进行除法运算。 点幂&#xff1a;表示元素对元素的幂运算。 >> A[1,2,3;4,5,6]; B[1,1,1;2,2,2]>> D1B.*AD…...

kalilinux - msf和永恒之蓝漏洞

Kali最强渗透工具 - metasploit metasploit是什么&#xff1f; msf是一款开源安全漏洞利用和测试工具&#xff0c;集成了各种平台上常见的溢出漏洞和流行的sheelcode&#xff0c;并持续保持更新。 具体操作 1、先切换到root用户&#xff0c;使用msfdb init命令初始化metaspl…...

网络安全测评质量管理与标准解读

大家读完觉得有帮助记得关注和点赞&#xff01;&#xff01;&#xff01; 注意说明 刚开始写过一些比较专业的分享&#xff0c;较多粉丝反应看不懂&#xff0c;本次通过大众的通俗易懂的词汇先了解概念然后再分享规范和详细的技术原理 一、网络安全测评质量管理 网络安全测…...

Cesium根据地图的缩放zoom实现不同级别下geojson行政边界的对应展示

实现效果&#xff1a; 随着地图的缩放&#xff0c;展示对应缩放级别下的行政边界。 准备数据&#xff1a; 1.国家行政边界数据 &#xff08;country.json&#xff09; 2.省级行政边界数据 &#xff08;province.json&#xff09; 3.市级行政边界数据&#xff08;city.json&…...

Linux初识:【shell命令以及运行原理】【Linux权限的概念与权限管理】

目录 一.shell命令以及运行原理 二.Linux权限的概念与权限管理 2.1Linux权限的概念 sudo普通用户提权 2.2Linux权限管理 2.2.1文件访问者的分类&#xff08;人&#xff09; 2.2.2文件类型和访问权限&#xff08;事物属性&#xff09; 2.2.3文件权限值的表示方法 字符…...

深入剖析 Wireshark:网络协议分析的得力工具

在网络技术的广阔领域中&#xff0c;网络协议分析是保障网络正常运行、优化网络性能以及进行网络安全防护的关键环节。而 Wireshark 作为一款开源且功能强大的网络协议分析工具&#xff0c;在网络工程师、安全专家以及网络技术爱好者中广受欢迎。本文将深入介绍 Wireshark 的功…...

【AIGC】SYNCAMMASTER:多视角多像机的视频生成

标题&#xff1a;SYNCAMMASTER: SYNCHRONIZING MULTI-CAMERA VIDEO GENERATION FROM DIVERSE VIEWPOINTS 主页&#xff1a;https://jianhongbai.github.io/SynCamMaster/ 代码&#xff1a;https://github.com/KwaiVGI/SynCamMaster 文章目录 摘要一、引言二、使用步骤2.1 TextT…...

PyTorch框架——基于深度学习YOLOv5神经网络水果蔬菜检测识别系统

基于深度学习YOLOv5神经网络水果蔬菜检测识别系统&#xff0c;其能识别的水果蔬菜有15种&#xff0c;# 水果的种类 names: [黑葡萄, 绿葡萄, 樱桃, 西瓜, 龙眼, 香蕉, 芒果, 菠萝, 柚子, 草莓, 苹果, 柑橘, 火龙果, 梨子, 花生, 黄瓜, 土豆, 大蒜, 茄子, 白萝卜, 辣椒, 胡萝卜,…...

Redisson中红锁(RedLock)的实现

一、什么是红锁 当在单点redis中实现redis锁时&#xff0c;一旦redis服务器宕机&#xff0c;则无法进行锁操作。因此会考虑将redis配置为主从结 构&#xff0c;但在主从结构中&#xff0c;数据复制是异步实现的。假设在主从结构中&#xff0c;master会异步将数据复制到slave中…...

小结:路由器和交换机的指令对比

路由器和交换机的指令有一定的相似性&#xff0c;但也有明显的区别。以下是两者指令的对比和主要差异&#xff1a; 相似之处 基本操作 两者都支持类似的基本管理命令&#xff0c;比如&#xff1a; 进入系统视图&#xff1a;system-view查看当前配置&#xff1a;display current…...

使用yarn命令创建Vue3项目

文章目录 1.技术栈2.创建流程2.1创建vue3项目2.2选择配置项2.3进入项目目录 3.使用Yarn启动项目3.1安装依赖3.2运行项目 1.技术栈 yarnvitevue3 2.创建流程 2.1创建vue3项目 vue create 项目名称2.2选择配置项 直接回车可选择Vue3 2.3进入项目目录 cd 项目名称默认在当前…...

Three.js+Vue3+Vite应用lil-GUI调试开发3D效果(三)

前期文章中我们完成了创建第一个场景、添加轨道控制器的功能&#xff0c;接下来我们继续阐述其他的功能&#xff0c;本篇文章中主要讲述如何应用lil-GUI调试开发3D效果&#xff0c;在开始具体流程和步骤之前&#xff0c;请先查看之前的内容&#xff0c;因为该功能必须在前期内容…...

K8S集群常用命令

1&#xff0c;查看pod kubectl get pods -A 查看所有的pod kubectl get pods 这个只查看namespace为default下的pod&#xff0c;也就是只查看默认命名空间下的pod kubectl get pod -A -o wide 查看所有的pod&#xff0c;并且放出的信息更全&#xff08;包含了pod的ip&#xff0…...

【优先算法】滑动窗口--(结合例题讲解解题思路)(C++)

目录 1. 例题1&#xff1a;最大连续1的个数 1.1 解题思路 1.2代码实现 1.3 错误示范如下&#xff1a;我最开始写了一种&#xff0c;但是解答错误&#xff0c;请看&#xff0c;给大家做个参考 2. 将 x 减到 0 的最小操作数 2.1解题思路 2.2代码实现 1. 例题1&#xff…...

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…...

从深圳崛起的“机器之眼”:赴港乐动机器人的万亿赛道赶考路

进入2025年以来&#xff0c;尽管围绕人形机器人、具身智能等机器人赛道的质疑声不断&#xff0c;但全球市场热度依然高涨&#xff0c;入局者持续增加。 以国内市场为例&#xff0c;天眼查专业版数据显示&#xff0c;截至5月底&#xff0c;我国现存在业、存续状态的机器人相关企…...

Rapidio门铃消息FIFO溢出机制

关于RapidIO门铃消息FIFO的溢出机制及其与中断抖动的关系&#xff0c;以下是深入解析&#xff1a; 门铃FIFO溢出的本质 在RapidIO系统中&#xff0c;门铃消息FIFO是硬件控制器内部的缓冲区&#xff0c;用于临时存储接收到的门铃消息&#xff08;Doorbell Message&#xff09;。…...

uniapp 开发ios, xcode 提交app store connect 和 testflight内测

uniapp 中配置 配置manifest 文档&#xff1a;manifest.json 应用配置 | uni-app官网 hbuilderx中本地打包 下载IOS最新SDK 开发环境 | uni小程序SDK hbulderx 版本号&#xff1a;4.66 对应的sdk版本 4.66 两者必须一致 本地打包的资源导入到SDK 导入资源 | uni小程序SDK …...

统计学(第8版)——统计抽样学习笔记(考试用)

一、统计抽样的核心内容与问题 研究内容 从总体中科学抽取样本的方法利用样本数据推断总体特征&#xff08;均值、比率、总量&#xff09;控制抽样误差与非抽样误差 解决的核心问题 在成本约束下&#xff0c;用少量样本准确推断总体特征量化估计结果的可靠性&#xff08;置…...

PostgreSQL 与 SQL 基础:为 Fast API 打下数据基础

在构建任何动态、数据驱动的Web API时&#xff0c;一个稳定高效的数据存储方案是不可或缺的。对于使用Python FastAPI的开发者来说&#xff0c;深入理解关系型数据库的工作原理、掌握SQL这门与数据库“对话”的语言&#xff0c;以及学会如何在Python中操作数据库&#xff0c;是…...

LINUX编译vlc

下载 VideoLAN / VLC GitLab 选择最新的发布版本 准备 sudo apt install -y xcb bison sudo apt install -y autopoint sudo apt install -y autoconf automake libtool编译ffmpeg LINUX FFMPEG编译汇总&#xff08;最简化&#xff09;_底部的附件列表中】: ffmpeg - lzip…...

MySQL 数据库深度剖析:事务、SQL 优化、索引与 Buffer Pool

在当今数据驱动的时代&#xff0c;数据库作为数据存储与管理的核心&#xff0c;其性能与可靠性至关重要。MySQL 作为一款广泛使用的开源数据库&#xff0c;在众多应用场景中发挥着关键作用。在这篇博客中&#xff0c;我将围绕 MySQL 数据库的核心知识展开&#xff0c;涵盖事务及…...

Steam爬取相关游戏评测

## 因为是第一次爬取Steam。所以作为一次记录发出&#xff1b;有所错误欢迎指出。 无时间指定爬取 import requests import time import csv import osappid "553850" # 这里你也可以改成 #appid int(input()) max_reviews 10000 # 想爬多少条 # max_reviews…...

Server - 使用 Docker 配置 PyTorch 研发环境

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/148421901 免责声明&#xff1a;本文来源于个人知识与公开资料&#xff0c;仅用于学术交流&#xff0c;欢迎讨论&#xff0c;不支持转载。 建议使…...