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

2024-04-27 15:44

本文主要是介绍面试经典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;
}

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

这篇关于面试经典150题——整数转罗马数字的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/940895

相关文章

字节面试 | 如何测试RocketMQ、RocketMQ?

字节面试:RocketMQ是怎么测试的呢? 答: 首先保证消息的消费正确、设计逆向用例,在验证消息内容为空等情况时的消费正确性; 推送大批量MQ,通过Admin控制台查看MQ消费的情况,是否出现消费假死、TPS是否正常等等问题。(上述都是临场发挥,但是RocketMQ真正的测试点,还真的需要探讨) 01 先了解RocketMQ 作为测试也是要简单了解RocketMQ。简单来说,就是一个分

秋招最新大模型算法面试,熬夜都要肝完它

💥大家在面试大模型LLM这个板块的时候,不知道面试完会不会复盘、总结,做笔记的习惯,这份大模型算法岗面试八股笔记也帮助不少人拿到过offer ✨对于面试大模型算法工程师会有一定的帮助,都附有完整答案,熬夜也要看完,祝大家一臂之力 这份《大模型算法工程师面试题》已经上传CSDN,还有完整版的大模型 AI 学习资料,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费

PTA求一批整数中出现最多的个位数字

作者 徐镜春 单位 浙江大学 给定一批整数,分析每个整数的每一位数字,求出现次数最多的个位数字。例如给定3个整数1234、2345、3456,其中出现最多次数的数字是3和4,均出现了3次。 输入格式: 输入在第1行中给出正整数N(≤1000),在第二行中给出N个不超过整型范围的非负整数,数字间以空格分隔。 输出格式: 在一行中按格式“M: n1 n2 ...”输出,其中M是最大次数,n

整数Hash散列总结

方法:    step1  :线性探测  step2 散列   当 h(k)位置已经存储有元素的时候,依次探查(h(k)+i) mod S, i=1,2,3…,直到找到空的存储单元为止。其中,S为 数组长度。 HDU 1496   a*x1^2+b*x2^2+c*x3^2+d*x4^2=0 。 x在 [-100,100] 解的个数  const int MaxN = 3000

java面试常见问题之Hibernate总结

1  Hibernate的检索方式 Ø  导航对象图检索(根据已经加载的对象,导航到其他对象。) Ø  OID检索(按照对象的OID来检索对象。) Ø  HQL检索(使用面向对象的HQL查询语言。) Ø  QBC检索(使用QBC(Qurey By Criteria)API来检索对象。 QBC/QBE离线/在线) Ø  本地SQL检索(使用本地数据库的SQL查询语句。) 包括Hibern

HotSpot虚拟机的经典垃圾收集器

读《深入理解Java虚拟机》第三版笔记。 关系 Serial、ParNew、Parallel Scavenge、Parallel Old、Serial Old(MSC)、Concurrent Mark Sweep (CMS)、Garbage First(G1)收集器。 如图: 1、Serial 和 Serial Old 收集器 2、ParNew 收集器 3、Parallel Sc

STL经典案例(四)——实验室预约综合管理系统(项目涉及知识点很全面,内容有点多,耐心看完会有收获的!)

项目干货满满,内容有点过多,看起来可能会有点卡。系统提示读完超过俩小时,建议分多篇发布,我觉得分篇就不完整了,失去了这个项目的灵魂 一、需求分析 高校实验室预约管理系统包括三种不同身份:管理员、实验室教师、学生 管理员:给学生和实验室教师创建账号并分发 实验室教师:审核学生的预约申请 学生:申请使用实验室 高校实验室包括:超景深实验室(可容纳10人)、大数据实验室(可容纳20人)、物联网实验

贝壳面试:什么是回表?什么是索引下推?

尼恩说在前面 在40岁老架构师 尼恩的读者交流群(50+)中,最近有小伙伴拿到了一线互联网企业如得物、阿里、滴滴、极兔、有赞、希音、百度、网易、美团的面试资格,遇到很多很重要的面试题: 1.谈谈你对MySQL 索引下推 的认识? 2.在MySQL中,索引下推 是如何实现的?请简述其工作原理。 3、说说什么是 回表,什么是 索引下推 ? 最近有小伙伴在面试 贝壳、soul,又遇到了相关的

毕业前第二次面试的感慨

距面试已经过去了有几天了,我现在想起来都有说多的恨感慨。 我一直都是想找刚刚起步的企业,因为这能让我学到更多的东西,然而正好有一家企业是刚起步的,而且他还有自己的产品专利,可以说这是一家,即是创业又是刚起步的公司,这家公司回复了我投给他的简历,这家企业想进一步了解我的情况,因为简历上我符合这家企业的基本要求,所以要进一步了解。 虽然面试的过程中,他给我的面试题,我做得并不是很理想,

腾讯社招面试经历

前提:本人2011年毕业于一个普通本科,工作不到2年。   15号晚上7点多,正在炒菜做饭,腾讯忽然打电话来问我对他们的Linux C++的职位是否感兴趣,我表达了我感兴趣之后,就开始了一段简短的电话面试,电话面试主要内容:C++和TCP socket通信的一些基础知识。之后就问我一道算法题:10亿个整数,随机生成,可重复,求最大的前1万个。当时我一下子就蒙了,没反应过来,何况我还正在烧