罗马数字包含以下七种字符:i
,v
,x
,l
,c
,d
和m
。
字符 数值i 1v 5x 10l 50c 100d 500m 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) 2017年跨年演唱会和c
(100) 的左边,来表示 40 和90。c
可以放在d
(500) 和m
(1000) 的左边,来表示400 和900。给定一个罗马数字,将其转换成整数。输入确保在 1到 3999 的范围内。
示例1:
输入:"iii"输出: 3
示例2:
输入:"iv"输出: 4
示例3:
输入:"ix"输出: 9
示例4:
输入:"lviii"输出: 58解释: l = 50, v= 5, iii = 3.
示例5:
输入:"mcmxciv"输出: 1994解释: m = 1000, cm = 900, xc = 90, iv = 4.
时间200ms左右,
思路是
把所有的情况放到哈希表中每次取一个位把 i 和 i+1 放一起,试试有没有区配的,有的话把 i 和 i+1 放一起没有的话,就是 只是计 ipublic class solution { public int romantoint(string s) { char[] c = s.tochararray(); //将其转为字符数组 int sum = 0; //值 hashtable hashtable = new hashtable(); //7个基本单位 hashtable.add("i", 1); hashtable.add("v", 5); hashtable.add("x", 10); hashtable.add("l", 50); hashtable.add("c", 100); hashtable.add("d", 500); hashtable.add("m", 1000); //加上6种情况 hashtable.add("iv", 4); hashtable.add("ix", 9); hashtable.add("xl", 40); hashtable.add("xc", 90); hashtable.add("cd", 400); hashtable.add("cm", 900);
/*
* 六种情况
iv 4 ix 9
xl 40品管圈活动 xc 90
cd 400 cm 9000
*/
for (int i = 0; i < c.length; i++) { if (i + 1 < c.length && hashtable.containskey(c[i].tostring() + c[i + 1].tostring())) //如果发现两位一起能区配的话 { sum += int.par(hashtable[c[i].tostring() + c[i + 1].tostring()].tostring()); 银行警示教育心得 //获取值,hashtable的类型都是object! i++; //跳两位 } el { sum += int.par(hashtable[c[i].tostring()].tostring()); } } return sum; } }
public class solution { public int romantoint(string s) { char[] c = s.tochararray(); //将其转为字符数组 int sum = 0; //值 dictionary<string, int> dictionary = new dictionary<string, int>(); //7个基本单位 dictionary.add("i", 1); dictionary.add("v", 5); dictionary.add("x", 10); dictionary.add("l", 50); dictionary.add("c", 100); dictionary.add("d", 500); dictionary.add("m", 1000); //加上6种情况 dictionary.add("iv", 4); dictionary.add("ix", 9); dictionary.add("xl", 40); dictionary.add("xc", 90); dictionary.add("cd", 400); dictionary.add("cm", 900);
/*
* 六种情况
iv 4 ix 9
xl 40 xc 90
cd 400 cm 9000
*/
for (int i = 0; i < c.length; i++) { if (i + 1 < c.length && dictionary.containskey(c[i].tostring() + c[i + 1])) //如果发现两位一起能区配的话 { sum += dictionary[c[i].tostring() + c[i + 1].tostring()]; //获取值,hashtable的类型都是object! i++; //跳两位 } el { sum += dictionary[c[i].tostring()]; } } return sum; } }
以上两个例子都会进行较多的装箱拆箱,下面主要使用if-el,switch,空间花销较大,但是如果测试例子较多,进行大量计算,时间会相对少一点。
public class solution { public int romantoint(string s) { int sum = 0; //值 for (int i = 0; i < s.length; i++) { if (i + 1 < s.length) //如果后面还有别的字符 { if (s[i] == 'i') { int a = 0; switch (s[i + 1]) //"i%" { ca 'v': a = 4; i++; break; ca 'x': a = 9; i++; break; default: a = 1; break; } sum += a; } el if (s[i] == 'x') { int a = 0; switch (s[i + 1]) //"x%" { ca 'l': a = 40; i++; break; 来个脑筋急转弯 ca 'c': a = 90; i++; break; default: a = 10; break; } sum += a; } el if (s[i] == 'c') { int a = 0; switch (s[i + 1]) //"x%" { ca 'd': a = 400; i++; break; ca 'm': a = 900; i++; break; default: a = 100; break; } sum += a; } el { int a = 0; switch (s[i]) {ca 'v': a = 5; break;ca 'l': a = 50; break;ca 'd': a = 500; break; ca 'm': a = 1000; break; } sum += a; } } el { int a = 0; switch (s[i]) { ca 'i': a = 1; break; ca 'v': a = 5; break; cas产后瑜伽e 'x': a = 10; break; ca 'l': a = 50; break; ca 'c': a = 100; break; ca 'd': a = 500; break; ca 'm': a = 1000; break; } sum += a; } } return sum; } }
到此这篇关于c#算法之罗马数字转整数的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持www.887551.com。
本文发布于:2023-04-04 16:18:17,感谢您对本站的认可!
本文链接:https://www.wtabcd.cn/fanwen/zuowen/616c137ffaee01dd5c0e6ec4e35979d8.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文word下载地址:C#算法之罗马数字转整数.doc
本文 PDF 下载地址:C#算法之罗马数字转整数.pdf
留言与评论(共有 0 条评论) |