面试经典150题——整数转罗马数字

面试经典150题 day18

      • 题目来源
      • 我的题解
        • 方法一 模拟
        • 方法二 不使用额外空间的方法

题目来源

力扣每日一题;题序:12

我的题解

方法一 模拟

俗称 狗屎代码 哈哈哈哈

时间复杂度:O(K)。K=13
空间复杂度:O(1)

public String intToRoman(int num) {
    Map<Integer,String> map=new HashMap<>();
    map.put(1,"I");
    map.put(4,"IV");
    map.put(5,"V");
    map.put(9,"IX");
    map.put(10,"X");
    map.put(40,"XL");
    map.put(50,"L");
    map.put(90,"XC");
    map.put(100,"C");
    map.put(400,"CD");
    map.put(500,"D");
    map.put(900,"CM");
    map.put(1000,"M");
    StringBuilder sb=new StringBuilder();
    int count=0;
    if(num>=1000){
        count=num/1000;
        num=num-count*1000;
        for(int i=0;i<count;i++)
            sb.append(map.get(1000));
    }
    if(num>=900){
        count=num/900;
        num=num-900;
        if(count!=0)
            sb.append(map.get(900));
    }
    if(num>=500){
        count=num/500;
        num=num-500;
        if(count!=0)
            sb.append(map.get(500));
    }
    if(num>=400){
        count=num/400;
        num=num-400;
        if(count!=0)
            sb.append(map.get(400));
    }
    if(num>=100){
        count=num/100;
        num=num-count*100;
        for(int i=0;i<count;i++)
            sb.append(map.get(100));
    }
    if(num>=90){
        count=num/90;
        num=num-90;
        if(count!=0)
            sb.append(map.get(90));
    }
    if(num>=50){
        count=num/50;
        num=num-50;
        if(count!=0)
            sb.append(map.get(50));
    }
    if(num>=40){
        count=num/40;
        num=num-40;
        if(count!=0)
            sb.append(map.get(40));
    }
    if(num>=10){
        count=num/10;
        num=num-count*10;
        for(int i=0;i<count;i++)
            sb.append(map.get(10));
    }
    if(num>=9){
        count=num/9;
        num=num-9;
        if(count!=0)
            sb.append(map.get(9));
    }
    if(num>=5){
        count=num/5;
        num=num-5;
        if(count!=0)
            sb.append(map.get(5));
    }
    if(num>=4){
        count=num/4;
        num=num-4;
        if(count!=0)
            sb.append(map.get(4));
    }
    if(num>=1){
        count=num/1;
        num=num-count;
        for(int i=0;i<count;i++)
            sb.append(map.get(1));
    }

    return sb.toString();
}
方法二 不使用额外空间的方法

其实和方法一相同,只是进行了一些封装。getStr函数按理说不应该这样写,可以使用TreeMap使得代码简洁,但是发现使用TreeMap之后,运行时间差的有点多。

时间复杂度:O(n)
空间复杂度:O(1)

public  String intToRoman(int num) {
    StringBuilder sb=new StringBuilder();
    while(num>0){
        String s=getStr(num);
        sb.append(s);
        num-=getVal(s);
    }
    return sb.toString();
}
public  String getStr(int num){
    if(num>=1000)
        return "M";
    else if(num>=900)
        return "CM";
    else if(num>=500)
        return "D";
    else if(num>=400)
        return "CD";
    else if(num>=100)
        return "C";
    else if(num>=90)
        return "XC";
    else if(num>=50)
        return "L";
    else if(num>=40)
        return "XL";
    else if(num>=10)
        return "X";
    else if(num==9)
        return "IX";
    else if(num>=5)
        return "V";
    else if(num==4)
        return "IV";
    else if(num>=1)
        return "I";
    else
        return "error";
}
public  int getVal(String str) {
    switch(str) {
        case "I": return 1;
        case "V": return 5;
        case "X": return 10;
        case "L": return 50;
        case "C": return 100;
        case "D": return 500;
        case "M": return 1000;
        case "IV": return 4;
        case "IX": return 9;
        case "XL": return 40;
        case "XC": return 90;
        case "CD": return 400;
        case "CM": return 900;
    }
    return 0;
}
//将上述的方式改为哈希表简化代码
TreeMap<Integer,String> numToRoman;
Map<String, Integer> romanToNum;
public String intToRoman(int num) {
    init();
    StringBuilder sb=new StringBuilder();
    while(num>0){
        String str=getStr(num);
        sb.append(str);
        num-=romanToNum.get(str);
    }
    return sb.toString();
}
public void init(){
    numToRoman=new TreeMap<>((a,b)->b-a);
    numToRoman.put(1,"I");
    numToRoman.put(4,"IV");
    numToRoman.put(5,"V");
    numToRoman.put(9,"IX");
    numToRoman.put(10,"X");
    numToRoman.put(40,"XL");
    numToRoman.put(50,"L");
    numToRoman.put(90,"XC");
    numToRoman.put(100,"C");
    numToRoman.put(400,"CD");
    numToRoman.put(500,"D");
    numToRoman.put(900,"CM");
    numToRoman.put(1000,"M");
    romanToNum = new HashMap<>();
    for (Map.Entry<Integer,String> entry : numToRoman.entrySet()) {
        romanToNum.put(entry.getValue(), entry.getKey());
    }
}
public String getStr(int num){
    String res="";
    for (Map.Entry<Integer,String> entry : numToRoman.entrySet()) {
        if(num>=entry.getKey()){
            res=entry.getValue();
            break;
        }
    }
    return res;
}

有任何问题,欢迎评论区交流,欢迎评论区提供其它解题思路(代码),也可以点个赞支持一下作者哈😄~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/577449.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Linux基础——Linux开发工具(gcc/g++,gdb)

前言&#xff1a;在上一篇我们简单介绍了yum&#xff0c;vim的一些常用的指令和模式&#xff0c;现在让我们来进一步了解其他的Linux环境基础开发工具gcc/g&#xff0c;gdb。 如果对前面yum和vim有什么不懂的建议回顾去回顾上期知识&#xff01;&#xff01;&#xff01; Linu…

C语言基础:初识指针(二)

当你不知道指针变量初始化什么时&#xff0c;可以初始化为空指针 int *pNULL; 我们看NULL的定义&#xff0c;可以看出NULL是0被强制转化为Void* 类型的0&#xff1b;实质还是个0&#xff1b; 如何避免野指针&#xff1a; 1. 指针初始化 2. 小心指针越界 3. 指针指向空间…

debian gnome-desktop GUI(图形用户界面)系统

目录 &#x1f31e;更新 &#x1f3a8;安装 &#x1f34e;分配 &#x1f6cb;️重启 &#x1f511;通过VNC连接 debian gnome-desktop &#x1f31e;更新 sudo apt update sudo apt -y upgrade &#x1f3a8;安装 sudo apt -y install task-gnome-desktop 这个过程比…

Java设计模式 _结构型模式_适配器模式

一、适配器模式 **1、适配器模式&#xff08;Adapter Pattern&#xff09;**是一种结构型设计模式。适配器类用来作为两个不兼容的接口之间的桥梁&#xff0c;使得原本不兼容而不能一起工作的那些类可以一起工作。譬如&#xff1a;读卡器就是内存卡和笔记本之间的适配器。您将…

Sy8网络管理命令(ubuntu23.10和centos8)

前言、 本次实验主要是扩展学习&#xff0c;不仅限在课本的内容。毕竟课本的内容太过于陈旧了。需要的童鞋看看。 说明&#xff1a;&#xff08;书本中sy9”第3.实验内容“大家还是要做下。&#xff09; 1、使用ubuntu做实验的童鞋只要看第二、三、四、七章节的部分内容。 2、使…

单片机为什么有多组VDD?

以前我在画尺寸小的PCB时&#xff0c;比较头痛&#xff0c;特别是芯片引脚又多的&#xff0c;芯片底下&#xff0c;又不能打太多过孔。 可能有些老铁也比较好奇&#xff0c;为什么一个单片机芯片&#xff0c;有这么多组VDD和VSS。 比如下面这个100个引脚的STM32单片机。 有5组…

Blender基础操作

1.移动物体&#xff1a; 选中一个物体&#xff0c;按G&#xff0c;之后可以任意移动 若再按X&#xff0c;则只沿X轴移动&#xff0c;同理可按Y与Z 2.旋转物体&#xff1a; 选中一个物体&#xff0c;按R&#xff0c;之后可以任意旋转 若再按X&#xff0c;则只绕X轴旋转&…

STM32、GD32等驱动AMG8833热成像传感器源码分享

一、AMG8833介绍 1简介 AMG8833是一种红外热像传感器&#xff0c;也被称为热感传感器。它可以用来检测和测量物体的热辐射&#xff0c;并将其转换为数字图像。AMG8833传感器可以感知的热源范围为-20C到100C&#xff0c;并能提供8x8的像素分辨率。它通过I2C接口与微控制器或单…

全面解析平台工程与 DevOps 的区别与联系

平台工程的概念非常流行&#xff0c;但很多开发人员仍然不清楚它是如何实际运作的&#xff0c;这是非常正常的。 平台工程是与 DevOps 并行吗&#xff1f;还是可以相互替代&#xff1f;或者 DevOps 和平台工程是两个完全不同的概念&#xff1f; 一种比较容易将两者区分开来的方…

Feign负载均衡

Feign负载均衡 概念总结 工程构建Feign通过接口的方法调用Rest服务&#xff08;之前是Ribbon——RestTemplate&#xff09; 概念 官网解释: http://projects.spring.io/spring-cloud/spring-cloud.html#spring-cloud-feign Feign是一个声明式WebService客户端。使用Feign能让…

AI大模型探索之路-训练篇5:大语言模型预训练数据准备-词元化

系列文章目录&#x1f6a9; AI大模型探索之路-训练篇1&#xff1a;大语言模型微调基础认知 AI大模型探索之路-训练篇2&#xff1a;大语言模型预训练基础认知 AI大模型探索之路-训练篇3&#xff1a;大语言模型全景解读 AI大模型探索之路-训练篇4&#xff1a;大语言模型训练数据…

法律知识学习考试系统 C#+uniapp+asp.net微信小程序

技术要求&#xff1a;后端C#&#xff0c;安卓app&#xff0c;mysql数据库 系统分为管理员、教师端和学生端: 管理员端实现管理员的注册登录以及教师和学生的注册、法律法规内容的发布与更新、法律法规页面的评论的添加与删除、内容查询、知识小测的内容发布与删除、问卷调查的发…

云计算和边缘计算究竟有什么不同

在数据时代&#xff0c;无论是人的活动还是机器的运作都会产生各种各样海量的数据。在对数据梳理和筛选过程中&#xff0c;计算机的运算处理必不可少。为了减少本地计算机算力成本等限制&#xff0c;越来越多的企业选择了云计算和边缘计算。今天&#xff0c;德迅云安全就带您来…

SpikingJelly笔记之梯度替代

文章目录 前言一、梯度替代二、网络结构三、MNIST分类1、单步模式2、多步模式 总结 前言 在SpikingJelly使用梯度替代训练SNN&#xff0c;构建单层全连接SNN实现MNIST分类任务。 一、梯度替代 1、梯度替代&#xff1a; 阶跃函数不可微&#xff0c;无法进行反向传播 g ( x ) …

miniTry:Python实现web搜索(全自动+程序操控)

声明&#xff1a;本问给出了全部代码--可以复现--亲测有效 :) [ 代码为图片--> 强制自己去敲一次 又不多] 1.打开网站&#xff1a; 2.利用id去定位到我们要进行输入的内容&#xff08;bing可以直接进行搜索&#xff0c;而csdn需要登录&#xff0c;所以我们用csdn做演示&…

HODL、FUD、FOMO 等其他比特币俚语是什么意思?

作者&#xff1a;Paxful Team 1、FOMO&#xff08;惧怕错失机会&#xff09; FOMO 是惧怕错失机会的缩写&#xff0c;可用于日常生活。它指的是当其他人都在谈论比特币时&#xff0c;产生的购买比特币的紧迫感。 2、Shill&#xff08;不断推广吹捧&#xff09; Shilling 是指…

linux支持vGPU方案

1&#xff0c;查询gpu型号&#xff1a;lspci | grep "NVIDIA\|VGA" PCI Devices 2&#xff0c;下载驱动 官方驱动 | NVIDIA 3&#xff0c;安装 sudo sh NVIDIA-Linux-x86_64-440.118.02.run -no-x-check -no-nouveau-check -no-opengl-files参数说明&#xff1a; …

自定义View-旋转变色圆角三角形的绘制

本文字数&#xff1a;3151字 预计阅读时间&#xff1a;20分钟 在现代设计中&#xff0c;动效图在APP的UI界面中所起到的作用无疑是显著的。相比于静态的界面&#xff0c;动效更符合人类的自然认知体系&#xff0c;它有效地降低了用户的认知负载&#xff0c;UI动效俨然已经成为了…

汽车新四化,会发生什么?

北京国际汽车展览会正如火如荼地进行中,作为国内外汽车行业瞩目的盛会&#xff0c;众多车企纷纷亮出了自家的“杀手锏”。 这场汽车的盛宴不仅集中展示了众多汽车品牌的最新技术和产品&#xff0c;更深刻体现了汽车新四化的发展趋势。汽车新四化&#xff0c;即电动化、网联化、…

DS进阶:AVL树和红黑树

一、AVL树 1.1 AVL树的概念 二叉搜索树&#xff08;BST&#xff09;虽可以缩短查找的效率&#xff0c;但如果数据有序或接近有序二叉搜索树将退化为单支树&#xff0c;查找元素相当于在顺序表中搜索元素&#xff0c;效率低下。因此&#xff0c;两位俄罗斯的数学家G.M.Adelson-…
最新文章