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

Leetcode 每日一题 12.整数转罗马数字

问题描述

将一个整数转换为罗马数字。罗马数字是由特定的符号组合而成的,每个符号代表不同的数值。以下是基本的罗马数字符号及其对应的值:

  • I = 1
  • V = 5
  • X = 10
  • L = 50
  • C = 100
  • D = 500
  • M = 1000

罗马数字的规则如下:

  1. 罗马数字是从小数位值的高位到低位添加的。
  2. 如果一个值不是以4或9开头,选择可以从输入中减去的最大值的符号,将该符号附加到结果,减去其值,然后将其余部分转换为罗马数字。
  3. 如果一个值以4或9开头,使用减法形式,例如4是5减1(IV),9是10减1(IX)。
  4. 只有10的次方(I, X, C, M)可以连续附加3次,而5(V)、50(L)和500(D)不能多次附加。如果需要附加4次,请使用减法形式。

给定一个整数,编写一个函数将其转换为罗马数字。

示例

示例 1

输入:num = 3749

输出:"MMMDCCXLIX"

解释:

  • 3000 = MMM(1000 * 3)
  • 700 = DCC(500 * 1 + 100 * 2)
  • 40 = XL(50 - 10)
  • 9 = IX(10 - 1)

示例 2

输入:num = 58

输出:"LVIII"

解释:

  • 50 = L
  • 8 = VIII(5 + 1 + 1 + 1)

示例 3

输入:num = 1994

输出:"MCMXCIV"

解释:

  • 1000 = M
  • 900 = CM(1000 - 100)
  • 90 = XC(100 - 10)
  • 4 = IV(5 - 1)

提示

1 <= num <= 3999

题解

算法思路

我们可以通过迭代的方式,从最大的罗马数字开始,逐步减去对应的数值,直到剩余的数值小于当前的罗马数字值。这样,我们可以构建出整个罗马数字字符串。

代码实现

 

java

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

算法分析

  • 时间复杂度:O(1),因为罗马数字的符号数量是有限的,所以循环的次数是固定的。
  • 空间复杂度:O(1),除了输入和输出,我们只需要一个固定大小的数组和字符串构建器。

http://www.kler.cn/a/392276.html

相关文章:

  • C++中的栈(Stack)和堆(Heap)
  • -1大于4?负数与无符号整数类型:size_t的比较问题(strlen)
  • SOLIDWORKS代理商鑫辰信息科技
  • 同三维T610UDP-4K60 4K60 DP或HDMI或手机信号采集卡
  • [CKS] 关闭API凭据自动挂载
  • 【机器学习】平均绝对误差(MAE:Mean Absolute Error)
  • 云原生-docker安装与基础操作
  • C/C++中使用MYSQL
  • 基于STM32的智能门禁系统设计
  • 达梦数据库DM管理工具增删改不生效怎么办?如何设置事务自动提交?
  • 从0开始学习Linux——用户管理
  • 索引的工作流程与执行原理
  • 【Qt】QtCreator安装安卓环境
  • React Query在现代前端开发中的应用
  • Mysql高可用架构方案
  • 腾讯云产品推荐----轻量级云服务器
  • 重学 Android 自定义 View 系列(六):环形进度条
  • Input子系统(一)、从内核文档入门(草稿,进度:10%)
  • 进程调度算法
  • 高频 SQL 50 题(基础版)连接部分
  • 鸿蒙next版开发:相机开发-适配不同折叠状态的摄像头变更(ArkTS)
  • Python中的闭包和装饰器
  • 方案丨车险保单OCR:3秒钟完成保单审核
  • 从0开始学习机器学习--Day24--核函数
  • LeetCode 328.奇偶链表
  • 【Lucene】原理学习路线