leetcode-第12题-整数转罗马数字

C++ 对比 Scheme(Lisp) 看了一下SICP的第一课 MIT 6.001 86年版的,用Scheme来解决实际问题确实是一种非常具有“美学”的语言。 C++11 也开始支持lambda表达式了,可以在对象或者函数里定义函数。类“Function-Orient Programming” 于是自己把第一课的例子用Scheme和C++11写了一下。 先是Lisp (define (average x y)(/ (+ 阅读详情

 博主并没有什么算法基础,所以写的不好,勿喷,抛砖引玉,欢迎交流,感谢。 

//罗马数字包含以下七种字符: I, V, X, L,C,D 和 M。 
// 字符          数值
//I             1
//V             5
//X             10
//L             50
//C             100
//D             500
//M             1000 
// 例如, 罗马数字 2 写做 II ,即为两个并列的 1。12 写做 XII ,即为 X + II 。 27 写做 XXVII, 即为 XX + V + II 。
// 通常情况下,罗马数字中小的数字在大的数字的右边。但也存在特例,例如 4 不写做 IIII,而是 IV。数字 1 在数字 5 的左边,所表示的数等于大数 5
// 减小数 1 得到的数值 4 。同样地,数字 9 表示为 IX。这个特殊的规则只适用于以下六种情况: 
// I 可以放在 V (5) 和 X (10) 的左边,来表示 4 和 9。
// X 可以放在 L (50) 和 C (100) 的左边,来表示 40 和 90。 
// C 可以放在 D (500) 和 M (1000) 的左边,来表示 400 和 900。 
// 给定一个整数,将其转为罗马数字。输入确保在 1 到 3999 的范围内。
// 示例 1:
// 输入: 3
//输出: "III" 
// 示例 2:
// 输入: 4
//输出: "IV" 
// 示例 3:
// 输入: 9
//输出: "IX" 
// 示例 4:
// 输入: 58
//输出: "LVIII"
//解释: L = 50, V = 5, III = 3.
// 示例 5:
// 输入: 1994
//输出: "MCMXCIV"
//解释: M = 1000, CM = 900, XC = 90, IV = 4. 
// Related Topics 数学 字符串 
// 👍 403 👎 0


package com.zqh.leetcode.editor.cn;

import java.util.Collections;
import java.util.HashMap;

//Java:整数转罗马数字
public class P12IntegerToRoman {
    public static void main(String[] args) {
        Solution solution = new P12IntegerToRoman().new Solution();
        // TO TEST
        System.out.println(solution.intToRoman(1));
        System.out.println(solution.intToRoman(2));
        System.out.println(solution.intToRoman(3));
        System.out.println(solution.intToRoman(4));
        System.out.println(solution.intToRoman(5));
        System.out.println(solution.intToRoman(6));
        System.out.println(solution.intToRoman(7));
        System.out.println(solution.intToRoman(8));
        System.out.println(solution.intToRoman(9));
        System.out.println(solution.intToRoman(10));
        System.out.println(solution.intToRoman(11));
        System.out.println(solution.intToRoman(12));
        System.out.println(solution.intToRoman(13));
        System.out.println(solution.intToRoman(14));
        System.out.println(solution.intToRoman(15));
        System.out.println(solution.intToRoman(16));
        System.out.println(solution.intToRoman(17));
        System.out.println(solution.intToRoman(18));
        System.out.println(solution.intToRoman(19));
        System.out.println(solution.intToRoman(20));
        System.out.println(solution.intToRoman(21));
        System.out.println(solution.intToRoman(22));
        System.out.println(solution.intToRoman(23));
        System.out.println(solution.intToRoman(24));
        System.out.println(solution.intToRoman(25));
        System.out.println(solution.intToRoman(26));
        System.out.println(solution.intToRoman(50));
        System.out.println(solution.intToRoman(58));
        System.out.println(solution.intToRoman(1994));
    }

    //leetcode submit region begin(Prohibit modification and deletion)
    class Solution {
        public String intToRoman(int num) {
//            NavigableMap<Integer, String> map = new TreeMap<>();
            HashMap<Integer, String> map = new HashMap<>(8);
            map.put(1, "I");
            map.put(5, "V");
            map.put(10, "X");
            map.put(50, "L");
            map.put(100, "C");
            map.put(500, "D");
            map.put(1000, "M");
            map.put(3999, "M");
//          解题要点  用了2种实现方法,但是leetcode不能使用NavigableMap
//          1. 获取每次的每个千位/百位/十位/个位,判断此数字的区间
//          2. 如果是<=3的:就自我复制;=4:当前位+下一位;>=6 && <=8:当前位+上1位;=9:上2位+当前位

            StringBuilder stringBuilder = new StringBuilder();
            char[] chars = (num + "").toCharArray();
            int j = chars.length - 1;
            while (num != 0) {
                if (j != 0) {
                    int c = num / (int) Math.pow(10, j);
//                    stringBuilder.append(num % (int) Math.pow(10, j) == 0 && map.keySet().contains(num % (int) Math.pow(10, j)) ?
//                            map.ceilingEntry(c * (int) Math.pow(10, j)).getValue() : getS(c, j, map));
                    stringBuilder.append(num % (int) Math.pow(10, j) == 0 && map.keySet().contains(num % (int) Math.pow(10, j)) ?
                            getSymbol(c * (int) Math.pow(10, j)) : getS(c, j));
                    num = num % (int) Math.pow(10, j);
                    j--;
                    continue;
                }
//                stringBuilder.append(getS(num, 0, map));
                stringBuilder.append(getS(num, 0));
                num = num / 10;
            }
            return stringBuilder.toString();
        }

        public String getSymbol(Integer number) {
            if (number >= 1 && number < 5) {
                return "I";
            } else if (number < 10) {
                return "V";
            } else if (number < 50) {
                return "X";
            } else if (number < 100) {
                return "L";
            } else if (number < 500) {
                return "C";
            } else if (number < 1000) {
                return "D";
            } else {
                return "M";
            }
        }

        //        public String getS(Integer number, int length, NavigableMap<Integer, String> map) {
        public String getS(Integer number, int length) {
            if (number <= 3) {
                //自我复制
//                String symbol = map.floorEntry(number * (int) Math.pow(10, length)).getValue();
                String symbol = getSymbol(number * (int) Math.pow(10, length));
                return String.join("", Collections.nCopies(number, symbol));
            }
            if (number == 4) {
                //当前位+下一位
//                String prefixSymbol = map.floorEntry(number * (int) Math.pow(10, length)).getValue();
//                String symbol = map.ceilingEntry(number * (int) Math.pow(10, length)).getValue();
                String prefixSymbol = getSymbol(number * (int) Math.pow(10, length));
                String symbol = getSymbol((number + 1) * (int) Math.pow(10, length));
                return prefixSymbol + symbol;
            }
            if (number >= 6 && number <= 8) {
                //当前位+上1位
//                String symbol = map.floorEntry(number * (int) Math.pow(10, length)).getValue();
//                String endSymbol = map.floorEntry(number * (int) Math.pow(10, length) - 5 * (int) Math.pow(10, length)).getValue();
                String symbol = getSymbol(number * (int) Math.pow(10, length));
                String endSymbol = getSymbol(number * (int) Math.pow(10, length) - 5 * (int) Math.pow(10, length));
                return symbol + String.join("", Collections.nCopies(number - 5, endSymbol));
            }
            if (number == 9) {
                //上2位+当前位
//                String prefixSymbol = map.floorEntry(number * (int) Math.pow(10, length) - 5 * (int) Math.pow(10, length)).getValue();
//                String symbol = map.ceilingEntry(number * (int) Math.pow(10, length)).getValue();
                String prefixSymbol = getSymbol(number * (int) Math.pow(10, length) - 5 * (int) Math.pow(10, length));
                String symbol = getSymbol((number + 1) * (int) Math.pow(10, length));
                return prefixSymbol + symbol;
            }
//            return map.ceilingEntry(number * (int) Math.pow(10, length)).getValue();
            return getSymbol(number * (int) Math.pow(10, length));
        }
    }
//leetcode submit region end(Prohibit modification and deletion)

}

 

LeetCode 第12题:整数转罗马数字 通过这个题目,我们了解了如何将整数转换为罗马数字。这个过程中,我们运用了贪心算法的思想,从最大值开始匹配,尽量匹配大的符号,这样可以减少计算步骤,提高效率。希望这篇博客能够帮助大家更好地理解和掌握这个题目。下次遇到类似的问题时,别忘了用这种贪心策略来试试看哦! 阅读详情

相关推荐

从零开始用STM32驱动RGB屏:配置PCLK、DE同步信号的避坑指南

本文详细介绍了如何使用STM32驱动RGB接口LCD屏幕,重点解析了PCLK配置、同步信号极性和DE使能等关键参数的设置方法。通过实战代码示例和常见问题排查指南,帮助开发者避免常见配置错误,实现稳定的显示效果。特别针对800x480 IPS屏提供了优化建议和调试技巧。

sky77的博客 539

LeetCode: 879. Profitable Schemes

LeetCode: 879. Profitable Schemes 题目描述 There are G people in a gang, and a list of various crimes they could commit. The i-th crime generates a profit[i] and requires group[i] gang members to parti...

杨领well的专栏 1234

Python实战:用MNE-Python从脑电数据中提取P300成分(附完整代码)

本文提供了一份使用MNE-Python从脑电数据中提取P300成分的完整实战指南。通过详细的代码示例,系统讲解了从环境搭建、数据加载、预处理(滤波、分段、伪迹剔除)到P300波形提取、可视化与参数量化的全流程。重点介绍了如何利用零相位滤波和叠加平均技术,从EEG信号中精准分离出反映认知加工的P300事件相关电位,适用于脑机接口与认知神经科学研究。

weixin_29240343的博客 338

USACO 1346. 回文平方

文章目录1346. 回文平方进制转换 1346. 回文平方 这道题主要考察进制转换。 #include <iostream> #include <algorithm> using namespace std; const int N = 22; int b; // 检查是否是回文 bool check(string str) { for(int i = 0 , j = str.size() - 1; i < j; i++ , j--) {

qq_45260619的博客 211

在Visual Studio中搭建Dynamo Python开发环境,效率飞一般的增长

在Visual Studio中搭建Dynamo Python开发环境,效率飞一般的增长

BIM的乐趣 1728

Windows 10/11 下用 Docker 一键部署 CVAT 标注工具(附 WSL2 配置指南)

本文详细指导如何在Windows 10/11系统上,通过配置WSL2和Docker Desktop,实现CVAT标注工具的一键部署。内容涵盖从环境准备、Docker安装、CVAT服务启动到性能优化与安全配置的全流程,为计算机视觉开发者提供稳定高效的本地标注平台解决方案。

weixin_28839601的博客 461

力扣LeetCode第12题整数转罗马数字

力扣LeetCode第12题整数转罗马数字

weixin_44061444的博客 237

咨询进阶——解读40页公司战略解码方法【附全文阅读】

战略解码是将企业战略转化为可执行计划的关键过程,强调垂直和水平一致性原则。通过KPI指标设计和目标分解,确保战略在各部门和岗位有效落地。解码过程包括战略澄清、目标牵引、绩效分解和承诺签订,输出战略解码图等文件。不同部门根据责任定位(如利润中心、绩效中心)采用差异化考核方式,实现战略有效执行。

cdfunlove的博客 148

[leetcode_12_intToRoman] 力扣第12题 整数转罗马数字

力扣第12题 整数转罗马数字

C_0010的博客 2650

基于matlab的阈值分割的车牌定位识别系统

车牌自动识别模块是现代社会智能交通系统(ITS)的重要组成部分,是图像处理和模式识别技术研究的热点,具有非常广泛的应用。车牌识别主要包括以下三个主要步骤:车牌区域定位、车牌字符分割、车牌字符识别。本案例通过对采集的车牌图像进行灰度变换、边缘检测、腐蚀及平滑等过程进行车牌图像预处理,并由此得到一种基于车牌颜色纹理特征的车牌定位方法,最终实现了车牌区域定位。车牌字符分割是为了方便后续对车牌字符进行匹配,从而对车牌进行识别。

在职AI算法工程师,擅长计算机视觉,YOLO目标检测、分割等,擅长web、pyqt界面可视化,好内容持续更新中,来这里跟大家一起学习,共同进步 966

工业缺陷标注要人命?我从零搭了一套自动标注系统,标注效率直接提升10倍

你是不是也深陷工业缺陷标注的无尽内耗?这不是个例,工业视觉项目落地,80%的时间和成本,都耗在了数据标注环节。普通的图像标注(猫狗分类、人脸识别),标注门槛低、规则简单、一致性要求宽松;而工业缺陷标注,是CV领域公认的地狱级难度:缺陷尺寸小到几像素、种类繁杂且非标、行业专业性极强、标注精度要求到像素级、正负样本极度不均衡,人工标注不仅效率低、成本高,更直接决定了模型的最终上限。我在工业视觉行业摸爬滚打了6年,踩遍了人工标注的所有坑,最终从零搭建了一套工业缺陷专用的闭环自动标注系统,把原来一张图30分钟的标注

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 201

LeetCode刷题记录——12整数转罗马数字

LeetCode刷题记录——12整数转罗马数字 一 题目描述: 罗马数字包括, I, V, X, L,C,D 和 M, 字符 数值 I 1 V 5 X 10 L 50 C 100 D 500 M 1000 例如1...

qq_42611498的博客 308

2026必学:LangChain+Playwright爬虫,赋能RAG智能问答系统

RAG(检索增强生成)智能问答系统的效果,80%取决于数据源的质量。2026年,LangChain与Playwright的组合成为企业级RAG数据采集的黄金搭档:LangChain提供标准化的RAG数据处理链路,Playwright解决动态网页渲染的核心痛点,两者结合能高效采集、结构化处理各类网页数据(动态渲染页、复杂交互页、反爬页),为RAG系统提供高质量语料。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 1705

深入探索力扣第12题:整数转罗马数字的算法之旅

提供一种高效且易于理解的算法和动态的GIF图,同时深入分析其背后的逻辑。

10年数据\经营分析经验,现任大厂数据分析负责人 743

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

LeetCode第12题思悟——整数转罗马数字(integer-to-roman)

LeetCode第12题思悟——整数转罗马数字(integer-to-roman) 文章目录LeetCode第12题思悟——整数转罗马数字(integer-to-roman)知识点预告题目要求示例我的思路其他优秀的解法差别分析知识点小结 知识点预告 获取整数确定数位上数字的方法; 映射的解题思路; 翻译“题目要求”的处理手段; 题目要求 罗马数字包含以下七种字符: I, V, X, L,C,...

博采众长,自成一派; 395

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

LeetCode第12题:整数转罗马数字

LeetCode第12题:整数转罗马数字 题目:给定一个整数,将其转为罗马数字。 解法一:逻辑很简单,代码写了好长。。。。 class Solution { public String intToRoman(int num) { if(num<1 || num>3999) return ""; String ans=""; i...

new_whiter的博客 279

力扣第12题整数转罗马数字

一、题目:12. 整数转罗马数字。

qq_39939541的博客 1821

力扣热题100实战 | 第12期:整数转罗马数字——贪心算法的经典实践

本文是力扣热题100实战系列的第十二篇,深度解析整数转罗马数字这道经典题目。作为LeetCode第12题,它是一道中等难度的题目,却是贪心算法最直观的应用案例之一。题目要求将1到3999范围内的整数转换为罗马数字表示。本文从最直观的硬编码法讲起,分析其局限性,然后逐步引出贪心算法的核心解法,通过建立数值与罗马符号的映射表,每次都选择尽可能大的数值进行转换。通过图解和详细代码注释,帮助读者理解贪心策略的正确性、映射表的设计思路、以及如何优雅地处理4和9等特殊数字。无论你是正在备战2026春招的Java程序员,

LinuxSRE、k8s、运维、DBA、大数据 739

1.LeetCode第12题,整数转罗马数字

1.LeetCode第12题,整数转罗马数字 原题目: 罗马数字包含以下七种字符: I, V, X, L,C,D 和 M。 字符 数值 I 1 V 5 X 10 L 50 C 100 D 500 M 1000 例如, 罗马数字 2 写做 II ,即为两个并列的 1。12 写做 XII ,即为 X + II 。 27 写做

weixin_38566677的博客 309

LeetCode 刷题【12. 整数转罗马数字】

将整数转换为罗马数字的算法实现。第一种采用逐步相减法,通过循环判断并减去对应数值来构建结果;第二种使用二维数组预先存储罗马数字组合,通过数位分解拼凑结果

gzkhxohc的博客 279

LeetCode高频题12:整数转罗马数字

1)打表整一个二维数组,0 1 2 3各个维度分别代表0--9,10--900,100--900,1000--3000,每一个数组除了特殊的49啥的是小数拼大数,其余都是大数拼小数,按照命名规则玩就行 2)总之,通过num除1000,100,10 ,1再去模10,就能分别得到千,百,十,个位上的数a,从高到低位,arr[i][a]就是咱们要的对应罗马数字字符串 3)笔试求AC,可以不考虑空间复杂度,但是面试既要考虑时间复杂度最优,也要考虑空间复杂度最优。...

weixin_46838716的博客 330

LeetCode第12题_整数转罗马数字

这道题的关键点:理解罗马数字的表示规则处理特殊情况(4和9的表示)选择合适的实现方法两种解法比较:贪心算法:思路清晰,容易理解硬编码数位:执行更快,代码更简洁优化思路:使用StringBuilder提高性能预计算所有可能的值减少不必要的计算。

qq_40263592的博客 786

leetCode刷题 & 12. 整数转罗马数字

面向对象编程?面向结果编程!

weixin_42378614的博客 613

力扣第12题:整数转罗马数字

力扣第12题:整数转罗马数字

一位想要成为优秀全栈工程师的有志青年! 697

leetcode第12题(整数转罗马数字)

leetcode第12题整数转罗马数字 用的贪心算法,每次求的都是最优解,思路很简单,啪啪的就写完了,很快啊! class Solution { public String intToRoman(int num) { int[] values = {1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1}; String[] symbols = {"M", "CM", "D", "CD", "C", "XC", "L"

LIMao_link 232

力扣刷题之12.整数转罗马数字

罗马数字包含以下七种字符:I,V,X,L,C,D和M。例如, 罗马数字 2 写做II,即为两个并列的 1。12 写做XII,即为X+II。 27 写做XXVII, 即为XX+V+II。 通常情况下,罗马数字中小的数字在大的数字的右边。但也存在特例,例如 4 不写做IIII,而是IV。数字 1 在数字 5 的左边,所表示的数等于大数 5 减小数 1 得到的数值 4 。同样地,数字 9 表示为IX。

Yyaduo的博客 1209
上一篇: leetcode-第1题-两数之和
下一篇: leetcode-第38题-外观数列
97牛肉面
博客等级 码龄9年 54粉丝 75原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值