LeetCode 面試經典 150_數組/字符串_整數轉羅馬數字(18_12_C++_中等)(模擬)(對各位進行拆解)

LeetCode 面試經典 150_數組/字符串_整數轉羅馬數字(18_12_C++_中等)

    • 題目描述:
    • 輸入輸出樣例:
    • 題解:
      • 解題思路:
        • 思路一(模擬):
        • 思路二(對各位進行拆解):
      • 代碼實現
        • 代碼實現(思路一(模擬)):
        • 代碼實現(思路二(對各位進行拆解)):
        • 以思路一為例進行調試

題目描述:

七個不同的符號代表羅馬數字,其值如下:

字符數值
I1
V5
X10
L50
C100
D500
M1000

羅馬數字是通過添加從最高到最低的小數位值的轉換而形成的。將小數位值轉換為羅馬數字有以下規則:

如果該值不是以 4 或 9 開頭,請選擇可以從輸入中減去的最大值的符號,將該符號附加到結果,減去其值,然后將其余部分轉換為羅馬數字。
如果該值以 4 或 9 開頭,使用 減法形式,表示從以下符號中減去一個符號,例如 4 是 5 (V) 減 1 (I): IV ,9 是 10 (X) 減 1 (I):IX。僅使用以下減法形式:4 (IV),9 (IX),40 (XL),90 (XC),400 (CD) 和 900 (CM)。
只有 10 的次方(I, X, C, M)最多可以連續附加 3 次以代表 10 的倍數。你不能多次附加 5 (V),50 (L) 或 500 (D)。如果需要將符號附加4次,請使用 減法形式
給定一個整數,將其轉換為羅馬數字。

輸入輸出樣例:

示例 1:
輸入:num = 3749
輸出:“MMMDCCXLIX”
解釋
3000 = MMM 由于 1000 (M) + 1000 (M) + 1000 (M)
700 = DCC 由于 500 (D) + 100 (C ) + 100 (C )
40 = XL 由于 50 (L) 減 10 (X)
9 = IX 由于 10 (X) 減 1 (I)
注意:49 不是 50 (L) 減 1 (I) 因為轉換是基于小數位

示例 2:
輸入:num = 58
輸出:“LVIII”
解釋
50 = L
8 = VIII

示例 3:
輸入:num = 1994
輸出:“MCMXCIV”
解釋
1000 = M
900 = CM
90 = XC
4 = IV

提示:
1 <= num <= 3999

題解:

解題思路:

思路一(模擬):

1、將整數與羅馬數字的對應關系列列出來。
{1000, “M”}
{900, “CM”}
{500, “D”}
{400, “CD”}
{100, “C”}
{90, “XC”}
{50, “L”}
{40, “XL”}
{10, “X”}
{9, “IX”}
{5, “V”}
{4, “IV”}
{1, “I”}
: 假設 num = 58

  • 先檢查是否大于或等于 1000
  • 再檢查是否大于或等于 900
  • 再檢查是否大于或等于 500
  • 再檢查是否大于或等于 400
  • 再檢查是否大于或等于 100
  • 再檢查是否大于或等于 90
  • 再檢查是否大于或等于 50,減去 50,結果 num = 8,添加 “L”。
  • 再檢查是否大于或等于 40
  • 再檢查是否大于或等于 10
  • 再檢查是否大于或等于 9
  • 再檢查是否大于或等于 5,減去 5,結果 num = 3,添加 “V”。
  • 再檢查是否大于或等于 4
  • 再檢查是否大于或等于 1,減去 1,結果 num = 2,添加 “I”。減去 1,結果 num = 1,添加 “I”。減去 1,結果 num = 1,添加 “I”。

2、復雜度分析:
① 時間復雜度:O(1),因循環執行次數有限。
② 空間復雜度:O(1)。

思路二(對各位進行拆解):

1、因 1 <= num <= 3999,所以可以建立一個 千位、百位、十位、個位的對應關系
千位 = {“”, “M”, “MM”, “MMM”}
百位 = {“”, “C”, “CC”, “CCC”, “CD”, “D”, “DC”, “DCC”, “DCCC”, “CM”}
十位 = {“”, “X”, “XX”, “XXX”, “XL”, “L”, “LX”, “LXX”, “LXXX”, “XC”}
個位 = {“”, “I”, “II”, “III”, “IV”, “V”, “VI”, “VII”, “VIII”, “IX”}

2、復雜度分析
① 時間復雜度:O(1)。
② 空間復雜度:O(1)。

代碼實現

代碼實現(思路一(模擬)):
class Solution1 {
public:string intToRoman(int num) {// 定義一個常量數組 valueSymbols,其中每個元素是一個pair<int, string>// 存儲的是整數和對應的羅馬數字符號對const pair<int,string> valueSymbols[]= {{1000, "M"},     // 1000 對應 "M"{900,  "CM"},    // 900 對應 "CM"{500,  "D"},     // 500 對應 "D"{400,  "CD"},    // 400 對應 "CD"{100,  "C"},     // 100 對應 "C"{90,   "XC"},    // 90 對應 "XC"{50,   "L"},     // 50 對應 "L"{40,   "XL"},    // 40 對應 "XL"{10,   "X"},     // 10 對應 "X"{9,    "IX"},    // 9 對應 "IX"{5,    "V"},     // 5 對應 "V"{4,    "IV"},    // 4 對應 "IV"{1,    "I"},     // 1 對應 "I"};string roman = "";  // 用于保存最終的羅馬數字字符串// 當 num > 0 時繼續循環,將 num 轉換為羅馬數字while (num > 0) {// 遍歷 valueSymbols 數組,按照從大到小的順序檢查每個值for (const auto &[value, symbol] : valueSymbols) {   //結構化綁定只能在-std=c++17中使用// 如果當前的 num 大于或等于該值,則減去該值,并將相應的符號添加到結果字符串中while (num >= value) {num -= value;       // 從 num 中減去該值roman += symbol;    // 將符號添加到 roman 字符串中}}}// 返回最終生成的羅馬數字字符串return roman;}
};
代碼實現(思路二(對各位進行拆解)):
class Solution2 {
public:string intToRoman(int num) {const string thousands[] = {"", "M", "MM", "MMM"};const string hundreds[]  = {"", "C", "CC", "CCC", "CD", "D", "DC", "DCC", "DCCC", "CM"};const string tens[]      = {"", "X", "XX", "XXX", "XL", "L", "LX", "LXX", "LXXX", "XC"};const string ones[]      = {"", "I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX"};return thousands[num / 1000] + hundreds[num % 1000 / 100] + tens[num % 100 / 10] + ones[num % 10];}
};
以思路一為例進行調試
#include<iostream>
using namespace std;class Solution1 {
public:string intToRoman(int num) {// 定義一個常量數組 valueSymbols,其中每個元素是一個pair<int, string>// 存儲的是整數和對應的羅馬數字符號對const pair<int,string> valueSymbols[]= {{1000, "M"},     // 1000 對應 "M"{900,  "CM"},    // 900 對應 "CM"{500,  "D"},     // 500 對應 "D"{400,  "CD"},    // 400 對應 "CD"{100,  "C"},     // 100 對應 "C"{90,   "XC"},    // 90 對應 "XC"{50,   "L"},     // 50 對應 "L"{40,   "XL"},    // 40 對應 "XL"{10,   "X"},     // 10 對應 "X"{9,    "IX"},    // 9 對應 "IX"{5,    "V"},     // 5 對應 "V"{4,    "IV"},    // 4 對應 "IV"{1,    "I"},     // 1 對應 "I"};string roman = "";  // 用于保存最終的羅馬數字字符串// 當 num > 0 時繼續循環,將 num 轉換為羅馬數字while (num > 0) {// 遍歷 valueSymbols 數組,按照從大到小的順序檢查每個值for (const auto &[value, symbol] : valueSymbols) {   //結構化綁定只能在-std=c++17中使用// 如果當前的 num 大于或等于該值,則減去該值,并將相應的符號添加到結果字符串中while (num >= value) {num -= value;       // 從 num 中減去該值roman += symbol;    // 將符號添加到 roman 字符串中}}}// 返回最終生成的羅馬數字字符串return roman;}
};int main(int argc, char const *argv[])
{int num=3749;Solution1 s;cout<<s.intToRoman(num)<<endl;return 0;
}

LeetCode 面試經典 150_數組/字符串_整數轉羅馬數字(18_12)原題鏈接
歡迎大家和我溝通交流(????)

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

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

相關文章

計算機網絡摘星題庫800題筆記 第6章 應用層

第6章 應用層 6.1 網絡應用的架構 考點 1 CS 架構 題組闖關 1.DNS 是基于 ( ) 模式的分布式系統。 A. C/S B. B/S C. P2P D. 以上均不正確 1.【參考答案】A 【解析】本題考查網絡應用模型。 DNS 作為分布式應用&#xff0c;是一種典型的 C/S 模式&#xff0c;是隨著 Internet 技…

BLUCK電路的輸入電容應該怎么選取

借用TI的BULK芯片討論一下輸入電容怎么選取的問題&#xff0c;BULK電源是我們常用的電源&#xff0c;它的原理請看之前的文章&#xff1a; 高壓差為何不用LDO&#xff1f;DCDC效率更高&#xff01;-CSDN博客 本文我們探討一下輸入電容&#xff0c;輸入電容是控制紋波的關鍵&a…

CAN仲裁機制的原理

我們來詳細講 CAN 仲裁機制 的原理和工作方式,這是 CAN 總線最核心的特性之一。 1?? 基本概念 CAN 總線是 多主機、多節點的串行總線,所有節點共享一根差分信號線(CAN_H / CAN_L)。 每個節點都可以隨時發送消息(多主機機制) 總線只能同時有一個節點成功發送 仲裁 用…

【GPT入門】第46課 vllm安裝、部署與使用

【GPT入門】第46課 vllm安裝、部署與使用 1.準備服務器 2. 安裝 conda環境,隔離base環境 3. vllm使用 3.1 在線推理, openai兼容服務器 3.2 模型離線調用 4. 沒有使用GPU問題分析 1.準備服務器 cuda 版本選12.1 vllm官網介紹: https://vllm.hyper.ai/docs/getting-started/…

【從網絡基礎到實戰】理解TCP/IP協議體系的核心要點(包含ARP協議等其他協議介紹)

前言&#xff1a; 學習計算機網絡不僅是軟件開發的基礎功&#xff0c;更是成為一名合格后端工程師、網絡工程師的重要門檻。本文將基于 TCP/IP 協議體系&#xff0c;系統梳理網絡層、數據鏈路層、以及相關協議的核心知識&#xff0c;并結合實際案例與代碼示例幫助理解。一、網絡…

Python 元類基礎:從理解到應用的深度解析

在 Python 的高級編程中&#xff0c;元類&#xff08;metaclass&#xff09; 無疑是最神秘又最強大的特性之一。它不僅是構建類的“工廠”&#xff0c;更是 Python 靈活對象模型的體現。本文將帶你從基礎概念入手&#xff0c;深入理解元類的本質、工作機制以及實際應用&#xf…

Nginx 配置代理服務器的詳細方法

一、什么是代理服務器&#xff1f; 類型說明正向代理客戶端通過代理訪問目標服務器&#xff08;隱藏客戶端身份&#xff09;反向代理客戶端訪問代理服務器&#xff0c;由代理服務器請求后端服務器&#xff08;隱藏后端服務器&#xff09; 二、Nginx 反向代理配置方法&#xff…

Lombok插件介紹及安裝(Eclipse)

一、Lombok 的用途 Lombok是一個 Java 庫&#xff0c;通過注解的方式簡化 Java 代碼的編寫。它能夠自動生成常見的代碼&#xff0c;如getter、setter、toString、equals、hashCode等方法&#xff0c;從而減少樣板代碼&#xff0c;使代碼更加簡潔、易讀。 Lombok 通過添加**Dat…

硬核操作!Go 語言生成 “會爬墻的清潔機器人”,玻璃外墻自己擦

本文聚焦于利用 Go 語言開發 “會爬墻的清潔機器人” 這一硬核技術&#xff0c;圍繞該機器人如何實現玻璃外墻自主清潔展開。首先介紹開發背景與需求&#xff0c;接著闡述 Go 語言在其中的優勢&#xff0c;詳細講解機器人的核心技術&#xff0c;包括吸附系統、運動控制、清潔機…

Qt——實現”Hello World“、認識對象樹與Qt坐標系

在創建項目時&#xff0c;使用的基類Base Class為QWidget 1. 使用圖形化界面的方式實現“Hello World” 雙擊文件&#xff1a;widget.ui&#xff0c;進入designer模式&#xff1a;在“控件盒子”的“Display Widgets”中找到“Label”&#xff0c;并拖放到白板中雙擊剛剛拖放到…

智能合約開發全流程實戰指南

目錄 靈感探索與概念驗證合約開發常見問題 Hardhat 初始化項目問題合約編譯錯誤處理智能合約設計缺陷 合約測試最佳實踐 單元測試環境配置測試用例編寫技巧測試覆蓋率和策略常見測試失敗原因 合約部署實戰指南 部署到不同網絡部署前準備事項部署后驗證方法部署費用和Gas優化 合…

IPA1299至為芯替代TI ADS1299的腦機接口芯片

在腦機接口、神經科學研究和醫療電子設備領域&#xff0c;腦電信號采集芯片是連接生物電信號與數字世界的重要組件。目前&#xff0c;TI等國際廠商憑借技術優勢占據市場主要份額&#xff0c;國內廠商在成本控制、供貨周期和技術自主性方面面臨挑戰。英集芯推出的IPA1299低噪聲多…

「數據獲取」《中國海洋生態環境狀況公報》(2001-2023年)(獲取方式看綁定的資源)

01、數據簡介在 2023 年的海洋環境監測工作中&#xff0c;監測范圍廣泛且細致。全年對 1359 個海洋環境質量國家控制點位進行了水質監測&#xff0c;這些點位分布在我國管轄的各大海域&#xff0c;能夠全面反映海洋整體水質狀況&#xff1b;對 230 個入海河流國家控制斷面開展監…

通過限制網絡訪問來降低服務器被攻擊風險的方法

限制網絡訪問是降低服務器被攻擊風險的核心思路之一&#xff0c;因為絕大多數入侵都是從開放的網絡入口開始的。思路是“減少暴露面 精確授權”&#xff0c;讓服務器只對必要的人、必要的業務開放。我給你分成幾個層次來說明&#xff0c;從最外層網絡入口到最內層系統配置都涉…

python與JavaScript的區別

Python 與 JavaScript 的主要區別&#xff08;按常用維度劃分&#xff09;維度PythonJavaScript誕生時間 / 背景1991 年&#xff0c;由 Guido van Rossum 設計&#xff0c;目標是“一種易讀、易寫的通用腳本語言”。1995 年&#xff0c;由 Brendan Eich 為 Netscape 瀏覽器誕生…

Java 比較器解析

一、比較器的核心作用與應用場景在 Java 編程中&#xff0c;數據比較是一個基礎但重要的操作。對于基本數據類型&#xff08;如 int、double、boolean、char 等&#xff09;&#xff0c;Java 語言本身就提供了完整的比較運算符&#xff08;>、<、、>、<、!&#xf…

Java學習第一百二十一部分——HTTP

目錄 一、前言簡介 二、核心特性 三、通信基礎結構 四、關鍵組件詳解 五、性能演進——版本對比 六、開發者建議 七、總結歸納 一、前言簡介 HTTP&#xff08;“H”yper“t”ext “T”ransfer “P”rotocol&#xff0c;超文本傳輸協議&#xff09;是互聯網上應用最廣泛…

記錄RK3588的docker中啟動rviz2報錯

安裝好rk3588 的docker&#xff0c;pull了ros的完整鏡像后&#xff0c;想要啟動rviz但是報錯&#xff0c;下面是我的踩坑記錄 0.原始的啟動鏡像的腳本&#xff1a; sudo docker run -it --rm --privileged --nethost -e DISPLAY$DISPLAY --namemy_image_name \-e DISPLAY$DIS…

ThingJS 新手學習技巧

一、ThingJS 基礎認知 1.1 ThingJS 是什么 ThingJS 是一款基于 WebGL 技術的 3D 可視化開發平臺&#xff0c;它為開發者提供了簡單易用的 API 和豐富的 3D 場景組件&#xff0c;讓開發者能夠快速構建出高質量的 3D 可視化應用。無論是智慧園區、智慧樓宇、智慧交通還是工業監…

【軟考架構】需求工程中,系統分析與設計的結構化方法

結構化方法誕生于20世紀70年代&#xff0c;是為了應對當時日益復雜的軟件系統開發挑戰&#xff08;如“軟件危機”&#xff09;而提出的。它強調系統性、規范性、分解和抽象&#xff0c;目標是提高軟件開發的效率、質量和可維護性&#xff0c;降低復雜性。 核心思想&#xff1a…