拿来吧你!⚡考研面试⚡每天练—— 整数转罗马数字

这是我参与 8 月更文挑战的第 10 天,活动详情查看: 8月更文挑战

?题目:

罗马数字包含以下七种字符: I, V, X, L,C,D 和 M。

字符          数值
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.
复制代码
提示:

1 <= num <= 3999
通过次数213,110提交次数320,090
复制代码

?一点点思路

看了这三天做的题以后,觉得题还是可以的不是说让你看到就没有头绪而是看着有点思路,可以跟着自己的思路写下去。**我们在前期就不要做太难的题以免会伤害我们的信心。**好了这道题一看,我的思路就是他说存在特殊值

I 可以放在 V (5) 和 X (10) 的左边,来表示 4 和 9。
X 可以放在 L (50) 和 C (100) 的左边,来表示 40 和 90。 
C 可以放在 D (500) 和 M (1000) 的左边,来表示 400 和 900。
复制代码

那么我们对他们特殊对待大不了就和前面的普通字符一样嘛都用哈希表设置一个key,还有一点大家要注意就是100的组成方式有很多种可以是十个10但我们只能选C

?开干

?介绍今天的函数

不知道大家对HashMapHashSet的区别知不知道,不知道的同学要注意哦,说不定面试就问你了(不知道私聊我)。我们今天介绍HashMap一会将要用到它构造数字和字符之间的对映关系
主要对外接口:

  • clear()

clear() 的作用是清空HashMap。它是通过将所有的元素设为null来实现的。

  • containsKey(key)

containsKey() 的作用是判断HashMap是否包含key。

  • containsValue(value)

containsValue() 的作用是判断HashMap是否包含“值为value”的元素。

  • entrySet()、values()、keySet()

entrySet()的作用是返回“HashMap中所有Entry的集合”,它是一个集合。

  • get(key)

get() 的作用是获取key对应的value

  • put(key,value)

put() 的作用是对外提供接口,让HashMap对象可以通过put()将“key-value”添加到HashMap中。

  • putAll(map)

putAll() 的作用是将”m”的全部元素都添加到HashMap中

  • remove(key)

remove() 的作用是删除“键为key”元素

  • clone()

克隆一个HashMap,并返回Object对象
我觉得弄懂一个自己不会的函数会很高兴你们呢?另外建议这些要和hashset对比记忆。

?源码及详解

很尴尬的事情发生了我本来想用HashMap来一个key对应一个值呢,看上面函数介绍我都做好了,做起题的时候发现用不到。哈哈哈那就把它放那里吧我们来看题解:

 public String luoma(int num) {
		int[] a= {1000,900,500,400,100,90,50,40,10,9,5,4,1};//把特殊的也弄成一个键值对
		String[] b= {"M","CM","D","CD","C","XC","L","XL","X","IX","V","IV","I"};
		//用来一会控制数组元素的指针
		int j=0;
		//存放最终输出结果
		String s="";
		for(int i:a) {
		//ans用来记录num/a里的元素的整数值比如4000/1000=4,后面就会出现四个M
			int ans=0;
			if(num!=0) {
				ans=(int)num/i;
				String xue="";//得到重复几个b[j]
				for(int fei=0;fei<ans;fei++) {
					xue=xue+b[j];
				}
				s=s+xue;//将结果字符串相合并
				num=num%i;//去除上面算过的
				j++;//移动指针
			}
		}
		return s;
	 }

复制代码

好了今天的算法题就到这里了,我们明天再见呀!

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享