LeetCode-Java:12.整数转罗马数字

news/2024/11/17 5:35:54/

罗马数字包含以下七种字符: IVXLCDM

字符          数值
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。

给你一个整数,将其转为罗马数字。

题目

罗马数字包含以下七种字符: IVXLCDM

字符          数值
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:

输入: num = 3
输出: "III"

示例 2:

输入: num = 4
输出: "IV"

示例 3:

输入: num = 9
输出: "IX"

示例 4:

输入: num = 58
输出: "LVIII"
解释: L = 50, V = 5, III = 3.

示例 5:

输入: num = 1994
输出: "MCMXCIV"
解释: M = 1000, CM = 900, XC = 90, IV = 4.

① 6+7=13种情况的if-else,按照从大到小顺序

最笨的办法,运行5ms,超过27.49%

class Solution {public String intToRoman(int num) {String str=new String();int x=0;if(num / 1000!=0){x=num/1000;while(x--!=0){str+="M";}num%=1000;}if(num/900!=0){x=num/900;while(x--!=0){str+="CM";}num%=900;} if(num/500!=0){x=num/500;while(x--!=0){str+="D";}num%=500;}        if(num/400!=0){x=num/400;while(x--!=0){str+="CD";}num%=400;}if(num/100!=0){x=num/100;while(x--!=0){str+="C";}num%=100;}if(num/90!=0){x=num/90;while(x--!=0){str+="XC";}num%=90;}if(num/50!=0){x=num/50;while(x--!=0){str+="L";}num%=50;}if(num/40!=0){x=num/40;while(x--!=0){str+="XL";}num%=40;}if(num/10!=0){x=num/10;while(x--!=0){str+="X";}num%=10;}if(num/9!=0){x=num/9;while(x--!=0){str+="IX";}num%=9;}if(num/5!=0){x=num/5;while(x--!=0){str+="V";}num%=5;}if(num/4!=0){x=num/4;while(x--!=0){str+="IV";}num%=4;}if(num!=0){while(num--!=0){str+="I";}}return str;}
}

② StringBuilder类

采用数组的方式存储了13种数据的大小和对应的字符串,当num=0时意味着循环结束可以返回字符串。

class Solution {public String intToRoman(int num) {StringBuilder sb=new StringBuilder();int[] nums = new int[]{1000,900,500,400,100,90,50,40,10,9,5,4,1};String [] str = new String[]{"M","CM","D","CD","C","XC","L","XL","X","IX","V","IV","I"};int count=0;while(num>0){while(num-nums[count]>=0){sb.append(str[count]);num-=nums[count];}count++;}return sb.toString();}
}

补充知识

StringBuilder类

StringBuilder是Java中用于处理字符串的可变类。它允许在不创建新的字符串对象的情况下,对字符串进行动态的修改和操作。

String类不同,StringBuilder对象是可变的,因此在需要对字符串进行多次修改时,使用StringBuilder通常会更高效。

上述①当中因为每次判断之后都需要对string进行修改,所以运行速率较慢,②通过使用StringBuilder类,比使用连接符’+'效率更快。

常用方法:

  1. append(): 在字符串构建器的末尾追加字符串、字符或其他数据。

    StringBuilder sb = new StringBuilder();
    sb.append("Hello");
    sb.append(" ");
    sb.append("world");
    
  2. insert(): 在指定位置插入字符串、字符或其他数据。

    StringBuilder sb = new StringBuilder("Hello world");
    sb.insert(5, ", "); // Hello, world
    
  3. delete(): 删除从指定位置开始到指定位置结束之间的字符(前闭后开,包括开始位置不包括结束位置)。

    StringBuilder sb = new StringBuilder("Hello world");
    sb.delete(5, 11); // 删除 " world" 变成 "Hello"
    
  4. deleteCharAt(): 删除指定位置的字符。

    StringBuilder sb = new StringBuilder("Hello world");
    sb.deleteCharAt(5); // 删除空格
    
  5. replace(): 用指定字符串替换从指定开始索引到指定结束索引之间的字符。

    StringBuilder sb = new StringBuilder("Hello world");
    sb.replace(6, 11, "Java"); // 替换 "world" 为 "Java"
    
  6. substring(): 返回从指定开始索引到指定结束索引之间的子字符串。

    StringBuilder sb = new StringBuilder("Hello world");
    String sub = sb.substring(6, 11); // 获取 "world"
    
  7. reverse(): 反转字符串。

    StringBuilder sb = new StringBuilder("Hello");
    sb.reverse(); // 变为 "olleH"
    
  8. charAt(): 返回指定索引处的字符。

    cStringBuilder sb = new StringBuilder("Hello");
    char c = sb.charAt(1); // 获取索引为1的字符 'e'
    
  9. length(): 返回字符串的长度。

    StringBuilder sb = new StringBuilder("Hello");
    int length = sb.length(); // 返回5
    
  10. indexOf() / lastIndexOf(): 返回指定字符串或字符在字符串构建器中第一次出现的索引或最后一次出现的索引。

    StringBuilder sb = new StringBuilder("Hello world");
    int index1 = sb.indexOf("o"); // 返回4
    int index2 = sb.lastIndexOf("o"); // 返回7
    
  11. toString(): 将字符串构建器转换为普通的字符串。

    StringBuilder sb = new StringBuilder("Hello world");
    String str = sb.toString(); // 返回 "Hello world"
    

http://www.ppmy.cn/news/1415382.html

相关文章

pytorch view、expand、transpose、permute、reshape、repeat、repeat_interleave

非contiguous操作 There are a few operations on Tensors in PyTorch that do not change the contents of a tensor, but change the way the data is organized. These operations include: narrow(), view(), expand() and transpose() permute() This is where the con…

keepalived2.2.8+drbd9+nfs高可用存储部署

目录 一.本文基于上一篇文章keepalived环境来做的,主机信息如下 二.为两台虚拟机准备添加一块新硬盘设备 三.安装drbd9 1.使用扩展源的rpm包来下载 2.创建资源并挂载到新增的硬盘 3.主设备升级身份 4.主备两个设备手动切换身份演示 四.安装配置nfs 五.安装…

从ChatGPT到多模态大模型:现状与未来(多模态)

ChatGPT 训练的核心技术主要包括: 预训练语言模型;有监督微调;基于人类反馈的 强 化 学 习 (ReinforcementLearningfrom Human Feedback,RLHF) 首先,通过自监督预训练使语言模型从大规模语料库中学习语言规律,具备基础 理解和生成能力;然后,通过构造指令微调数据集 并对模型进…

【嵌入式学习】ARM day04.11

一、思维导图 二、练习 实现三个灯闪烁 汇编代码 .text .global _start _start: 使能GPIOE和F时钟LDR r0,0x50000A28LDR r1,[R0]ORR R1,R1,#(0X3<<4)STR R1,[R0]配置GPIOE和F的MODER寄存器LDR r0,0x50006000 GPIOELDR R1,0X50007000 G…

每天学点儿Python(5) -- 序列索引和切片

Python中&#xff0c;序列是指一块可存放多个值的连续内存空间&#xff0c;这些值按一定顺序排列&#xff0c;可通过每个值所在位置的编号&#xff08;称为索引&#xff09;访问它们。它类似于C/C中的数组或字符串&#xff0c;但又比数组或字符串强大很多 序列类型包括字符串、…

专科学习嵌入式合适吗?

专科学习嵌入式是完全合适的&#xff0c;但确实需要注意一些因素以确保你的学习之路更加顺利。我这里有一套嵌入式入门教程&#xff0c;不仅包含了详细的视频讲解&#xff0c;项目实战。如果你渴望学习嵌入式&#xff0c;不妨点个关注&#xff0c;给个评论222&#xff0c;私信2…

【图论】Dijkstra单源最短路径-朴素方法-简单模板(迪杰斯特拉算法)

Dijkstra单源最短路径 问题描述 输入n 表示n个结点&#xff0c;m表示m条边&#xff0c;求编号1的结点到每个点的最短路径 输出从第一个点到第n个点的最短路径 思路 将图g[][]中所有的权值初始化为0x3f表示正无穷 将dist[]中所有的值初始化为0x3f表示从第一个点到所有点的距离…

JavaGUI编程

目录 GUI概念 Swing概念 组件 容器组件 窗口&#xff08;JFrame&#xff09; 代码 运行 面板&#xff08;JPanel&#xff09; 代码 运行 布局管理器 FlowLayout 代码 运行 BorderLayout 代码 运行 GridLayout 代码 运行 常用组件 标签(JLabel) 代码 运…