整數編碼【華為OD機試-JAVAPythonC++JS】

題目描述

實現一種整數編碼方法,使得待編碼的數字越小,編碼后所占用的字節數越小。
編碼規則如下:
編碼時7位一組,每個字節的低7位用于存儲待編碼數字的補碼
字節的最高位表示后續是否還有字節,置1表示后面還有更多的字節,置0表示當前字節為最后一個字節。
采用小端序編碼,低位和低字節放在低地址上。
編碼結果按16進制數的字符格式輸出,小寫字母需轉換為大寫字母
輸入描述
輸入的為一個字符串表示的非負整數
待編碼的數字取值范圍為[0,1<<64 - 1]
輸出描述
輸出一個字符串,表示整數編碼的16進制碼流
用例

輸入0
輸出00
說明輸出的16進制字符,不足兩位的前面補0,如00、01、02。
輸入100
輸出64
說明

100的二進制表示為0110 0100,只需要一個字節進行編碼;

字節的最高位置0,剩余7位存儲數字100的低7位 (110 0100) ,所以編碼后的輸出為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、Java、C/C++、JS。

主要思路如下:

  1. 將輸入的非負整數轉換成二進制字符串。
  2. 將二進制字符串按照7位一組進行編碼,每個字節的低7位用于存儲待編碼數字的補碼。
  3. 字節的最高位表示后續是否還有字節,置1表示后面還有更多的字節,置0表示當前字節為最后一個字節。
  4. 采用小端序編碼,低位和低字節放在低地址上。
  5. 將編碼結果按16進制數的字符格式輸出,小寫字母需轉換為大寫字母。

以上提供的代碼分別是Python、Java、C/C++和JS的實現,你可以選擇其中一種適合你的編程環境和喜好的語言進行使用。

題解代碼

Python題解代碼

num = int(input())
# 將待編碼數字轉換成二進制字符串
binaryStr = bin(num)[2:]
result = ''# 每7位一組進行編碼
for end in range(len(binaryStr), 0, -7):# 取出當前組需要編碼的二進制字符串currentBinaryStr = binaryStr[max(end - 7, 0):end]# 判斷當前字節是否為最后一個字節,設置最高位flag = '1' if end - 7 > 0 else '0'# 將當前字節轉換成十進制數decimal = int(flag + currentBinaryStr, 2)# 將當前字節的十六進制字符串形式添加到結果中hexStr = hex(decimal)[2:].upper()# 如果十六進制字符串長度為1,需要在前面補0hexStr = '0' + hexStr if len(hexStr) == 1 else hexStr# 將當前字節的十六進制字符串形式添加到結果中result += hexStr# 返回編碼結果的十六進制字符串形式
print(result)

JAVA題解代碼

/*** 實現一個整數編碼方法* 使得待編碼的數字越小* 編碼后所占用的字節數越小* 編碼規則如下:* 1.編碼時7位一組,每個字節的低7位用于存儲待編碼數字的補碼* 2.字節的最高位表示后續是否還有字節,置1表示后面還有更多的字節,*   置0表示當前字節為最后一個字節* 3.采用小端序編碼,低位和低字節放在低地址上* 4.編碼結果按16進制數的字符格式進行輸出,小寫字母需要轉化為大寫字母*/
import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);long num = scanner.nextLong();// 將待編碼數字轉換成二進制字符串String binaryStr = Long.toBinaryString(num);StringBuilder result = new StringBuilder();// 每7位一組進行編碼for (int end = binaryStr.length(); end > 0; end -= 7) {// 取出當前組需要編碼的二進制字符串String currentBinaryStr = binaryStr.substring(Math.max(end - 7, 0), end);// 判斷當前字節是否為最后一個字節,設置最高位char flag = (end - 7 > 0) ? '1' : '0';// 將當前字節轉換成十進制數int decimal = Integer.parseInt(flag + currentBinaryStr, 2);// 將當前字節的十六進制字符串形式添加到結果中String hexStr = Integer.toHexString(decimal);// 如果十六進制字符串長度為1,需要在前面補0hexStr = (hexStr.length() == 1) ? "0" + hexStr : hexStr;// 將小寫字母轉換為大寫字母,并將當前字節的十六進制字符串形式添加到結果中result.append(hexStr.toUpperCase());}// 返回編碼結果的十六進制字符串形式System.out.println( result.toString());}}

C/C++題解代碼

#include <iostream>
#include <string>
#include <bitset>
#include <sstream>
#include <algorithm>
using namespace std;int main() {long num;cin >> num;// 將待編碼數字轉換成二進制字符串string binaryStr = bitset<64>(num).to_string();size_t start = binaryStr.find_first_not_of('0');if (start != string::npos) {binaryStr = binaryStr.substr(start);} else {binaryStr = "0";}stringstream result;// 每7位一組進行編碼for (int end = binaryStr.length(); end > 0; end -= 7) {// 取出當前組需要編碼的二進制字符串string currentBinaryStr = binaryStr.substr(max(end - 7, 0), end - max(end - 7, 0));// 判斷當前字節是否為最后一個字節,設置最高位char flag = (end - 7 > 0) ? '1' : '0';// 將當前字節轉換成十進制數int decimal = stoi(string(1, flag) + currentBinaryStr, nullptr, 2);// 將當前字節的十六進制字符串形式添加到結果中stringstream hexStr;hexStr << hex << decimal;// 如果十六進制字符串長度為1,需要在前面補0if (hexStr.str().length() == 1) {result << "0";}// 將小寫字母轉換為大寫字母,并將當前字節的十六進制字符串形式添加到結果中result << hexStr.str();}string rt = result.str();transform(rt.begin(), rt.end(), rt.begin(), ::toupper);// 返回編碼結果的十六進制字符串形式cout <<  rt   << endl;return 0;
}

JS題解代碼

const readline = require("readline");// 創建readline接口實例
const rl = readline.createInterface({input: process.stdin,output: process.stdout,
});// 監聽line事件,當輸入數據時觸發回調函數
rl.on("line", (line) => {// 將輸入的非負整數轉換為二進制字符串const binStr = BigInt(line).toString(2);// 定義一個數組來存儲編碼結果const ans = [];// 從二進制字符串的末尾開始,每七位一組進行編碼let end = binStr.length;while (end - 7 > 0) {// 將每一組轉換為十六進制字符串,并添加到結果數組中ans.push(parseInt("1" + binStr.substring(end - 7, end), 2).toString(16).padStart(2, '0').toUpperCase());// 更新末尾位置end -= 7;}// 處理最后一組,如果有剩余的位數不足七位,則直接編碼if (end >= 0) {ans.push(parseInt(binStr.substring(0, end), 2).toString(16).padStart(2, '0').toUpperCase());}// 將編碼結果數組拼接為一個字符串,并輸出console.log(ans.join(""));
});

代碼OJ評判結果

通過測試點

代碼講解

Python題解代碼講解

  1. 輸入處理: 通過input()函數獲取待編碼的非負整數。
  2. 二進制轉換: 使用bin()函數將待編碼數字轉換為二進制字符串,并去掉開頭的’0b’。
  3. 循環編碼: 從二進制字符串的末尾開始,每7位一組進行編碼。
    • 取出當前組需要編碼的二進制字符串。
    • 判斷當前字節是否為最后一個字節,設置最高位。
    • 將當前字節轉換成十進制數,然后轉換為十六進制字符串。
    • 如果十六進制字符串長度為1,需要在前面補0。
    • 將當前字節的十六進制字符串形式添加到結果中。
  4. 輸出結果: 將編碼結果的十六進制字符串形式輸出。

JAVA題解代碼講解

  1. 輸入處理: 使用Scanner獲取待編碼的非負整數。
  2. 二進制轉換: 使用Long.toBinaryString()將待編碼數字轉換為二進制字符串。
  3. 循環編碼: 從二進制字符串的末尾開始,每7位一組進行編碼。
    • 取出當前組需要編碼的二進制字符串。
    • 判斷當前字節是否為最后一個字節,設置最高位。
    • 將當前字節轉換成十進制數,然后轉換為十六進制字符串。
    • 如果十六進制字符串長度為1,需要在前面補0。
    • 將小寫字母轉換為大寫字母,并將當前字節的十六進制字符串形式添加到結果中。
  4. 輸出結果: 將編碼結果的十六進制字符串形式輸出。

C/C++題解代碼講解

  1. 輸入處理: 使用cin獲取待編碼的非負整數。
  2. 二進制轉換: 使用bitset將待編碼數字轉換為64位的二進制字符串。
  3. 循環編碼: 從二進制字符串的末尾開始,每7位一組進行編碼。
    • 取出當前組需要編碼的二進制字符串。
    • 判斷當前字節是否為最后一個字節,設置最高位。
    • 將當前字節轉換成十進制數,然后轉換為十六進制字符串。
    • 如果十六進制字符串長度為1,需要在前面補0。
    • 將小寫字母轉換為大寫字母,并將當前字節的十六進制字符串形式添加到結果中。
  4. 輸出結果: 將編碼結果的十六進制字符串形式輸出。

JS題解代碼講解

  1. 輸入處理: 使用readline模塊創建接口實例,監聽line事件獲取待編碼的非負整數。
  2. 二進制轉換: 使用BigInt()將待編碼數字轉換為二進制字符串。
  3. 循環編碼: 從二進制字符串的末尾開始,每7位一組進行編碼。
    • 將每一組轉換為十六進制字符串,并添加到結果數組中。
  4. 輸出結果: 將編碼結果數組拼接為一個字符串,并輸出。

寄語

🚀? 朋友,希望你的華為OD機試就像是一場輕松的技術party!愿你的代碼如同暢快的音符,跳躍在鍵盤上,最后彈奏出一曲高分之歌。加油,你是技術舞臺上的巨星!通過機試,就像是風輕云淡,輕輕松松就把高分收入囊中。祝愿你的編程之旅一路順風,破風前行,每一行代碼都是成功的注腳!🌈💻

在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/710980.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/710980.shtml
英文地址,請注明出處:http://en.pswp.cn/news/710980.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

pytorch -- GPU優化寫法套路

1. GPU優化的點 網絡模型 數據&#xff08;輸入、標注) 損失函數 .cuda方式 代碼&#xff1a; import torch.optim import torchvision from torch import nn from torch.utils.data import DataLoader from torch.utils.tensorboard import SummaryWriter# 1. 準備數據集 t…

C++實現XOR加解器

#include <Windows.h> #include <iostream> #include <fstream> #include <string>// 加解密函數&#xff0c;使用XOR運算 void XORCrypt(char* data, int size, const std::string& key) {int keyLength key.length();for (int i 0; i < siz…

日志系統項目實現

日志系統的功能也就是將一條消息格式化后寫入到指定位置&#xff0c;這個指定位置一般是文件&#xff0c;顯示器&#xff0c;支持拓展到數據庫和服務器&#xff0c;后面我們就知道如何實現拓展的了&#xff0c;支持不同的寫入方式(同步異步)&#xff0c;同步:業務線程自己寫到文…

萬卡集群:字節搭建12288塊GPU的單一集群

文章目錄 論文Reference 論文 MegaScale: Scaling Large Language Model Training to More Than 10,000 GPUs 論文鏈接&#xff1a;https://arxiv.org/abs/2402.15627 從結構上講&#xff0c;網絡是基于Clos的“胖樹”結構。其中一個改進是在頂層交換機上把上行與下行鏈路分開&…

三、《任務列表案例》前端程序搭建和運行

本章概要 整合案例介紹和接口分析 案例功能預覽接口分析 前端工程導入 前端環境搭建導入前端程序 啟動測試 3.1 整合案例介紹和接口分析 3.1.1 案例功能預覽 3.1.2 接口分析 學習計劃分頁查詢 /* 需求說明查詢全部數據頁數據 請求urischedule/{pageSize}/{currentPage} 請…

stm32觸發硬件錯誤位置定位

1.背景 1. 項目中&#xff0c;調試過程或者測試中都會出現程序跑飛問題&#xff0c;這個時候問題特別難查找。 2. 觸發硬件錯誤往往是因為內存錯誤。這種問題特別難查找&#xff0c;尤其是產品到了測試階段&#xff0c;而這個異常復現又比較難的情況下&#xff0c;簡直頭疼。…

初學JavaScript總結

0 JavaScript html完成了架子&#xff0c;css做了美化&#xff0c;但是網頁是死的&#xff0c;需要給他注入靈魂&#xff0c;所以接下來需要學習JavaScript&#xff0c;這門語言會讓頁面能夠和用戶進行交互。JavaScript又稱為腳本語言&#xff0c;可以通過腳本實現用戶和頁面的…

每日shell腳本之打印99乘法表

每日shell腳本之打印99乘法表 #!/bin/bash for i in $(seq 1 9); dofor j in $(seq 1 9); doecho -n "$i * $j $(($i * $j)) "doneecho done

Programming Abstractions in C閱讀筆記:p306-p307

《Programming Abstractions in C》學習第75天&#xff0c;p306-p307總結&#xff0c;總計2頁。 一、技術總結 1.Quicksort algorithm(快速排序) 由法國計算機科學家C.A.R(Charles Antony Richard) Hoare&#xff08;東尼.霍爾&#xff09;在1959年開發(develop), 1961年發表…

Mac 制作可引導安裝器

Mac 使用U盤或移動固態硬盤制作可引導安裝器&#xff08;以 Monterey 為例&#xff09; 本教程參考 Apple 官網相關教程 創建可引導 Mac OS 安裝器 重新安裝 Mac OS 相關名詞解釋 磁盤分區會將其劃分為多個單獨的部分&#xff0c;稱為分區。分區也稱為容器&#xff0c;不同容器…

VR虛擬現實技術應用到豬抗原體檢測的好處

利用VR虛擬仿真技術開展豬瘟檢測實驗教學確保生豬產業健康發展 為了有效提高豬場豬瘟防控意識和檢測技術&#xff0c;避免生豬養殖業遭受豬瘟危害&#xff0c;基于VR虛擬仿真技術開展豬瘟檢測實驗教學數據能大大推動基層畜牧養殖業持續穩步發展保駕護航。 一、提高實驗效率 VR虛…

鯤鵬arm64架構下安裝KubeSphere

鯤鵬arm64架構下安裝KubeSphere 官方參考文檔: https://kubesphere.io/zh/docs/quick-start/minimal-kubesphere-on-k8s/ 在Kubernetes基礎上最小化安裝 KubeSphere 前提條件 官方參考文檔: https://kubesphere.io/zh/docs/installing-on-kubernetes/introduction/prerequi…

基于大模型思維鏈(Chain-of-Thought)技術的定制化思維鏈提示和定向刺激提示的心理咨詢場景定向ai智能應用

本篇為個人筆記 記錄基于大模型思維鏈&#xff08;Chain-of-Thought&#xff09;技術的定制化思維鏈提示和定向刺激提示的心理咨詢場景定向ai智能應用 人工智能為個人興趣領域 業余研究 如有錯漏歡迎指出&#xff01;&#xff01;&#xff01; 目錄 本篇為個人筆記 記錄基…

價格腰斬,騰訊云2024優惠活動云服務器62元一年,多配置報價

騰訊云服務器多少錢一年&#xff1f;62元一年起&#xff0c;2核2G3M配置&#xff0c;騰訊云2核4G5M輕量應用服務器218元一年、756元3年&#xff0c;4核16G12M服務器32元1個月、312元一年&#xff0c;8核32G22M服務器115元1個月、345元3個月&#xff0c;騰訊云服務器網txyfwq.co…

Node.js中的并發和多線程處理

在Node.js中&#xff0c;處理并發和多線程是一個非常重要的話題。由于Node.js是單線程的&#xff0c;這意味著它在任何給定時間內只能執行一個任務。然而&#xff0c;Node.js的事件驅動和非阻塞I/O模型使得處理并發和多線程變得更加高效和簡單。在本文中&#xff0c;我們將探討…

【排坑】搭建 Karmada 環境

git clone 報錯 問題&#xff1a;Failed to connect to github.com port 443:connection timed out 解決&#xff1a; git config --global --unset http.proxy【hack/local-up-karmada.sh】 1. karmada ca-certificates (no such package) 問題&#xff1a;fetching http…

老化的電動車與高層電梯樓的結合,將是巨大的安全隱患

中國是全球最大的電動汽車市場&#xff0c;其實中國還是全球最大的電動兩輪車市場&#xff0c;而電動兩輪車的老化比電動汽車更快&#xff0c;電動汽車的電池壽命可以達到10年&#xff0c;而電動兩輪車的電池壽命只有3-5年&#xff0c;而首批電動兩輪車至今已老化得相當嚴重&am…

【Pytorch深度學習開發實踐學習】【AlexNet】經典算法復現-Pytorch實現AlexNet神經網絡(1)model.py

算法簡介 AlexNet是人工智能深度學習在CV領域的開山之作&#xff0c;是最先把深度卷積神經網絡應用于圖像分類領域的研究成果&#xff0c;對后面的諸多研究起到了巨大的引領作用&#xff0c;因此有必要學習這個算法并能夠實現它。 主要的創新點在于&#xff1a; 首次使用GPU…

AI語音識別的技術解析

從語音識別算法的發展來看&#xff0c;語音識別技術主要分為三大類&#xff0c;第一類是模型匹配法&#xff0c;包括矢量量化(VQ) 、動態時間規整(DTW)等&#xff1b;第二類是概率統計方法&#xff0c;包括高斯混合模型(GMM) 、隱馬爾科夫模型(HMM)等&#xff1b;第三類是辨別器…

golang gin單獨部署vue3.0前后端分離應用

概述 因為公司最近的項目前端使用vue 3.0&#xff0c;后端api使用golang gin框架。測試通過后&#xff0c;博文記錄&#xff0c;用于備忘。 步驟 npm run build&#xff0c;構建出前端項目的dist目錄&#xff0c;dist目錄的結構具體如下圖 將dist目錄復制到后端程序同級目錄…