面试经典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";elsereturn "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.mzph.cn/web/4086.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MATLAB初学者入门(21)—— 霍夫曼树

霍夫曼编码是一种广泛用于数据压缩的有效技术。它基于字符频率或概率来构造最优的前缀码&#xff0c;使得常用字符的编码长度较短&#xff0c;不常用的字符编码长度较长&#xff0c;从而达到压缩数据的目的。MATLAB中可以通过一系列步骤来实现霍夫曼树的构建和相应的编码过程。…

25计算机考研院校数据分析 | 南京大学

南京大学&#xff08;Nanjing University&#xff09;&#xff0c;简称“南大”&#xff0c;是中华人民共和国教育部直属、中央直管副部级建制的全国重点大学&#xff0c;国家首批“双一流”、“211工程”、“985工程”重点建设高校&#xff0c;入选首批“珠峰计划”、“111计划…

python实现DIY高考倒计时小软件

目录 一.前言 二.代码 三.分析 一.前言 高考是中国的全国性统一考试,全称为普通高等学校招生全国统一考试。它被认为是中国教育系统中最重要、最具决定性的考试之一。高考是中国学生从初中毕业后进入高中学习三年后的最终考试,也是他们升入大学的关键。 二.代码 import…

WordPress AI Engine 插件 文件上传致RCE漏洞复现(CVE-2023-51409)

0x01 产品简介 AI Engine插件是WordPress中的AI一体化解决方案,包括创建聊天机器人、生成内容和图像、推荐标题和帖子摘录、支持多种人工智能引擎等功能,可以节省用户时间。 0x02 漏洞概述 WordPress AI Engine 插件upload接口存在文件上传漏洞,未经身份验证的远程攻击者…

分布式复习提纲(ppt)

第一章 分布式系统定义&#xff1a;硬件控制数据基本属性必要属性主要特征 1-37目标 1-38 可访问性开放性可扩展性可用性可靠性透明性 1-43、 1-94 分布式支持技术 Ad hoc&#xff1a;IPC中间件 1-66、1-82 中间件要解决的问题 1-18 中间件的类别、特性 1-20RPC 安全性&#xf…

(四)Servlet教程——Maven的安装与配置

1.在C盘根目录下新建一个Java文件夹,该文件夹用来放置以下步骤下载的Maven&#xff1b; 2. 下载Maven的来源有清华大学开源软件镜像站和Apache Maven的官网&#xff0c;由于清华大学开源软件镜像站上只能下载3.8.8版本以上的Maven&#xff0c;我们选择在Apache Maven的官网上下…

codeforce#933 题解

E. Rudolf and k Bridges 题意不讲了&#xff0c;不如去题干看图。 传统dp&#xff0c;每个点有两个选择&#xff0c;那么建桥要么不建。需要注意的是在状态转移的时候&#xff0c;桥是有长度的&#xff0c;如果不建需要前d格中建桥花费最少的位置作为状态转移的初态。 #incl…

深度学习论文: MobileNetV4 - Universal Models for the Mobile Ecosystem及其PyTorch实现

深度学习论文: MobileNetV4 - Universal Models for the Mobile Ecosystem及其PyTorch实现 MobileNetV4 - Universal Models for the Mobile Ecosystem PDF: https://arxiv.org/pdf/2404.10518.pdf PyTorch代码: https://github.com/shanglianlm0525/CvPytorch PyTorch代码: ht…

Collections.singletonList

1、Collections.singletonList public static <T> List<T> singletonList(T o) {return new SingletonList<>(o); } 列表只有一个元素&#xff0c;节省内存&#xff0c;返回列表不可以改变。 2、Arrays.asList public static <T> List<T> asL…

swagger xss漏洞复现

swagger xss漏洞复现 文章目录 swagger xss漏洞复现漏洞介绍影响版本实现原理漏洞复现修复建议: 漏洞介绍 Swagger UI 有一个有趣的功能&#xff0c;允许您提供 API 规范的 URL - 一个 yaml 或 json 文件&#xff0c;将被获取并显示给用户 根本原因非常简单 - 一个过时的库Dom…

高级控件5-RecyclerView

与ViewPager类似的一个滑动的高级控件是RecyclerView&#xff0c;使用更加灵活。 第1步&#xff1a;添加依赖 打开mvn官网&#xff0c;检索recyclerview&#xff0c;选择使用人数较多的版本&#xff0c;复制依赖&#xff0c;放入项目中即可 快捷方法&#xff08;复制下面的代…

科普:PD协议、QC协议、三星AFC、华为SCP是什么,怎么获取这些协议及协议通讯原理

PD协议是什么 PD协议是由 USB-IF 组织制定的一种快速充电规范&#xff0c;它一般使用Type-C接口&#xff0c;所以常见的Type-C接口充电器一般都是支持PD协议。 USB Power Delivery(USB PD)是目前主流的快充协议之一&#xff0c;USB PD 通过Type-C电缆和连接器增加电力输送&…

【Unity动画系统】动画基本原理与Avater骨骼复用

动画基本原理 动画片段文件是一个描述物体变化状态的文本文件 在Unity中创建的资源文件大多都是YAML语言编写的文本文件 Curves表示一种变化状态&#xff0c;为空的话则没有记录任何内容 位置变化后的旋转变化状态&#xff1a; 动画文件里的Path名字要相同才能播放相同的动画 …

uniapp制作分页查询功能

效果 代码 标签中 <uni-pagination change"pageChanged" :current"pageIndex" :pageSize"pageSize" :total"pageTotle" class"pagination" /> data中 pageIndex: 1, //分页器页码 pageSize: 10, //分页器每页显示…

[笔试训练](九)

目录 025&#xff1a;添加逗号 026&#xff1a;跳台阶 027&#xff1a;扑克牌顺子 025&#xff1a;添加逗号 添加逗号_牛客题霸_牛客网 (nowcoder.com) 题目&#xff1a; 题解&#xff1a; 将输入的数字&#xff0c;每次模上10&#xff0c;从个位开始取每一位数&#xff…

[C++ QT项目实战]----C++ QT系统登陆界面设计

前言 在C QT项目开发过程中&#xff0c;设计系统登录界面可以使用QT框架来实现。以下是一个简单的系统登录界面设计示例&#xff1a; 创建登录界面UI&#xff1a;可以使用QT Designer来设计登录界面的UI&#xff0c;包括用户名输入框、密码输入框、登录按钮等。在QT Designer中…

Centos8操作系统安装mysql5.7版本以及报错解决

目录 一、卸载MySql 1.首先查看已安装的mysql 2.逐个或者执行一下命令统一卸载掉 注意&#xff1a; 3. 卸载其他相关文件 二、安装MySql 1.安装mysql的rpm源 2.安装MySql 如果遇到以下错误&#xff1a; 问题一: 解决方法&#xff1a; 问题二、 解决方法&#xff1…

基本的SQL语句类型

基本的SQL语句类型 1. 数据查询语句 介绍数据查询语句的基本语法和用途&#xff0c;包括SELECT语句用于从数据库中检索数据&#xff0c;以及条件筛选、排序和聚合等操作。 2. 数据操作语句 解释数据操作语句的作用&#xff0c;包括INSERT语句用于向数据库中插入新记录&…

C语言面试题之相交链表

相交链表 实例要求 1、给定两个单链表的头节点 headA 和 headB &#xff0c;请你找出并返回两个单链表相交的起始节点。2、如果两个链表不存在相交节点&#xff0c;返回 null 。示例&#xff1a; 实例分析 可以使用两种方法&#xff1a;哈希表方法和双指针方法。哈希表方法…

在 Quartz 的集群模式中,SchedulerThread线程多久会执行一次检查?

目录 引言 调度逻辑与时间计算 computeTimeToNextTrigger 方法 行为特点 引言 在 Quartz 的集群模式中&#xff0c;SchedulerThread 线程的执行频率取决于触发器的状态和计划时间。没有一个固定的时间间隔&#xff0c;因为线程需要适应当前调度器的任务需求。这个线程主要任…