罗马数字

PHP算法之整数转罗马数字

依然范特西╮ 提交于 2019-12-06 16:09:47
罗马数字包含以下七种字符: 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 到 3999 的范围内。 示例 1: 输入: 3 输出: "III" 示例 2: 输入: 4 输出: "IV" 示例 3: 输入: 9 输出: "IX" 示例 4: 输入: 58 输出: "LVIII" 解释: L = 50, V = 5, III = 3. 示例 5: 输入: 1994 输出: "MCMXCIV" 解释: M =

【LeetCode 13】罗马数字转整数

流过昼夜 提交于 2019-12-03 15:38:08
题目链接 【题解】 就是上一题反过来的过程。 因为有说一般情况下后面的罗马数字是小于前面的罗马数字的。 如果前面的罗马数字小于后面的罗马数字了。 说明出现了4,9,40,90这些特殊情况。 那么就得判断一下下了。 直接用map<string,int>把所有的罗马数字对应的数字都放进去。 然后就很好做啦。 写的时候遇到一个问题。 就是string temp = 一个char类型+另外一个char类型变量。 会出错。。。 得这么写 string temp=""; temp+=charA; temp+=charB; 【代码】 class Solution { public: int romanToInt(string s) { map<string,int> dic; dic.clear(); int nums[]={1,4,5,9,10,40,50,90,100,400,500,900,1000}; string roma[]={"I","IV","V","IX","X","XL","L","XC","C","CD","D","CM","M"}; for (int i = 0;i < 13;i++) dic[roma[i]] = nums[i]; int len = s.size(); int ans = 0; for (int i = 0;i < len;i++){ string

【LeetCode 12】整数转罗马数字

烂漫一生 提交于 2019-12-03 15:33:14
题目链接 【题解】 (涨知识了。。原来罗马数字是这么回事。。 把{1,4,5,9,10,40,50,90,100,400,500,900,1000}这些东西的罗马数字放在一个数组里面。 每次从大到小减。 减一个加上对应的罗马数字就好。 【代码】 class Solution { public: string intToRoman(int num) { int nums[]={1,4,5,9,10,40,50,90,100,400,500,900,1000}; string roma[]={"I","IV","V","IX","X","XL","L","XC","C","CD","D","CM","M"}; string temp = ""; for (int i = 12;i >=0;i--){ if (num>=nums[i]){ while (num>=nums[i]){ temp = temp + roma[i]; num-=nums[i]; } } } return temp; } }; 来源: https://www.cnblogs.com/AWCXV/p/11802433.html

十三_罗马数字转整数

匿名 (未验证) 提交于 2019-12-03 00:18:01
这题转成字符数组后遍历就是了 ----------------------------------------------------------------------------------------------- 罗马数字包含以下七种字符: I V X L , C , D M 。 字符 数值 I 1 V 5 X 10 L 50 C 100 D 500 M 1000 II XII X II XXVII XX V II IIII IV IX 。这个特殊的规则只适用于以下六种情况: I V X X L C C D M 输入: 输出: 3 输入: 输出: 4 输入: 输出: 9 输入: 输出: 58 解释: C = 100, L = 50, XXX = 30, III = 3. 输入: 输出: 1994 解释: M = 1000, CM = 900, XC = 90, IV = 4. class Solution { public int romanToInt(String s) { char[] ch = s.toCharArray(); int sum = 0; for (int i = 0; i < ch.length; i++) { switch (ch[i]) { case 'I': sum += 1; break; case 'V': sum += 5; if(i-1>

leetcode 壹之型 罗马数字和数字的互相转换

一个人想着一个人 提交于 2019-12-02 15:52:59
      不知哪个大佬说过: 关于字符串的题都可以用指针或哈希解决。        罗马数字转数字:       思想: 我们能观察到规律: 一般情况下,表示大的字母在前,小字母在后;                   特殊情况下,小字母会在大字母之前,但是相应的,得到的值会是大字母-小字母          所以,我们可以用哈希表映射大小,利用 哈希表比较所给罗马字母,一般情况直接+该对应值,否则-该对应值 class Solution { public: //用哈希表映射字符,处理特殊条件:前字母<后字母==前字母变负数 int romanToInt(string s) { map<char,int> hash; hash['I'] = 1; hash['V'] = 5; hash['X'] = 10; hash['L'] = 50; hash['C'] = 100; hash['D'] = 500; hash['M'] = 1000; int sum = 0; for(int i = 0;i<s.size();++i) { if(hash[s[i]] < hash[s[i+1]]) { sum-=hash[s[i]]; continue; } sum+=hash[s[i]]; } return sum; } };        数字转罗马数字:        思想 :

leetcode 13. 罗马数字转整数

微笑、不失礼 提交于 2019-12-02 14:28:53
我觉得这个就是简单的前进问题,用不到动态规划,只是向前前进几个值就可以了。多用几个if,遇见特殊的向前多检查几个字符,就是这样。 看看网上的,网上的方法就是构建出所有的子字符串数据,然后按照最大匹配原则匹配出来,真的牛。从没有规律的地方发现规律,从而简化代码。 总的数字有 I II III ,可以转化成一个I,77 IV,IX 4,9 77+86=163,77+88=165 XL,XC, 40,90 88+76=164,88+67=155 CD,CM 400, 900,67+68=135,67+77=144 在ascii码表中,I为73,V为86,X为88,L为76,C为67,D为68,M为77 因此划分一个200的数组就足够了 每次提取时,如果后面的字符比较大,那么它就是一个负数这样。但是需要注意的是不能有不合规矩的数。但此题是没有的。 成功了,真简单。 class Solution { public: int romanToInt(string s) { int arr[200]; arr['I'] = 1; arr['V'] = 5; arr['X'] = 10; arr['L'] = 50; arr['C'] = 100; arr['D'] = 500; arr['M'] = 1000; int res = 0; int n = s.size(); if(n == 0)

12. 整数转罗马数字

萝らか妹 提交于 2019-12-02 10:50:26
罗马数字包含以下七种字符: 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 到 3999 的范围内。 示例 1 : 输入 : 3 输出 : "III" 示例 2 : 输入 : 4 输出 : "IV" 示例 3 : 输入 : 9 输出 : "IX" 示例 4 : 输入 : 58 输出 : "LVIII" 解释 : L = 50 , V = 5 , III = 3. 示例 5

算法题--整数转罗马数字

荒凉一梦 提交于 2019-12-01 23:24:17
题目描述 罗马数字包含以下七种字符: 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 到 3999 的范围内。 示例 1: 输入: 3 输出: "III" 示例 2: 输入: 4 输出: "IV" 示例 3: 输入: 9 输出: "IX" 示例 4: 输入: 58 输出: "LVIII" 解释: L = 50, V = 5, III = 3. 示例 5: 输入: 1994 输出: "MCMXCIV" 解释:

罗马数字转阿拉伯数字

自古美人都是妖i 提交于 2019-12-01 16:45:20
罗马数字转阿拉伯数字 1.罗马数字是位置计数吗?它的缺点是什么? 答:罗马数字不是位置计数 它的缺点:①无法使用罗马数字表示0。 ②数字表示麻烦,无法直观的表示数字。 ③书写繁难。 2.把你的8位学号转化成罗马数字 答:学号:20191330 转换后:(由于Markdown找不到上划线语法,所以用图片代替) 3.参考上面的博客,用Python写一个罗马数字转化为阿拉伯数字的程序,并验证上面你的学号对不对 来源: https://www.cnblogs.com/leo-skr/p/11693670.html

leetcode——13. 罗马数字转整数

我们两清 提交于 2019-12-01 16:27:18
class Solution: def romanToInt(self, s: str) -> int: memo={'I':1,'IV':4,'V':5,'IX':9,'X':10,'XL':40,'L':50,'XC':90,'C':100,'CD':400,'D':500,'CM':900,'M':1000} i=0 v=0 while i<len(s): if i<len(s)-1 and s[i] in ['I','X','C']: if s[i:i+2] in ['IV','IX','XL','XC','CD','CM']: v+=memo[s[i:i+2]] i+=2 else: v+=memo[s[i]] i+=1 else: v+=memo[s[i]] i+=1 return v 执行用时 :72 ms, 在所有 python3 提交中击败了65.93%的用户 内存消耗 :14.1 MB, 在所有 python3 提交中击败了5.25%的用户 ——2019.10.17 来源: https://www.cnblogs.com/taoyuxin/p/11693038.html