Leetcode c语言-Roman to Integer
来源:互联网 发布:weibull++软件下载 编辑:程序博客网 时间:2024/06/05 10:36
Title:
Given a roman numeral, convert it to an integer.
Input is guaranteed to be within the range from 1 to 3999.
这道题和上道题相反,将罗马数字转换成数字。
两种解法:
第一种,穷举法,列举出所有可能。
这是所有罗马数字的整数,从1-3999. 任意一个数字都可以由下列进行组合得到。
{
""
,
"I"
,
"II"
,
"III"
,
"IV"
,
"V"
,
"VI"
,
"VII"
,
"VIII"
,
"IX"
},
{
""
,
"X"
,
"XX"
,
"XXX"
,
"XL"
,
"L"
,
"LX"
,
"LXX"
,
"LXXX"
,
"XC"
},
{
""
,
"C"
,
"CC"
,
"CCC"
,
"CD"
,
"D"
,
"DC"
,
"DCC"
,
"DCCC"
,
"CM"
},
{
""
,
"M"
,
"MM"
,
"MMM"
}
int romanToInt(char* s) { int result; int i=0; int a = 0; int b=0; int c=0; int d=0; while (s[i]) { if (s[i] == 'M') { if (i>=1 && s[i-1]=='C') b=900; else a=a+1000; } else if (s[i] == 'C') { if (i>=1 && s[i-1]=='X') c=90; else if (s[i+1]=='D') b=400; else if (i>=1 && s[i-1]=='D') b=600; else if (i>=2 && s[i-1]=='C' && s[i-2]=='D') b=700; else if (i>=3 && s[i-1]=='C' && s[i-2]=='C' && s[i-3]=='D') b=800; else if (i>=0 && s[i+1]!='M') b=b+100; } else if (s[i] == 'D') { if (s[i-1]!='C' && s[i+1]!='C') b=500; } else if (s[i] == 'X') { if (s[i+1] == 'L') c=40; else if (i>=1 && s[i-1]=='L') c=60; else if (i>=2 && s[i-1]=='X' && s[i-2]=='L') c=70; else if (i>=3 && s[i-1]=='X' && s[i-2]=='X' && s[i-3]=='L') c=80; else if (i>=1 && s[i-1]=='I') d=9; else if (i>=0 && s[i+1]!='C'){ c=c+10; } } else if (s[i] == 'L') { if (i>=1 && s[i-1]!='X' && s[i+1]!='X') c=50; else if (i<1 && s[i+1]!='X') c=50; } else if (s[i] == 'I') { if (s[i+1] == 'V') d=4; else if (i>=1 && s[i-1]=='V') d=6; else if (i>=2 && s[i-1]=='I' && s[i-2]=='V') d=7; else if (i>=3 && s[i-1]=='I' && s[i-2]=='I' && s[i-3]=='V') d=8; else if (i>=0 && s[i+1]!='X') d=d+1; } else if (s[i] == 'V') { if (s[i-1]!='I' && s[i+1]!='I') d=5; } i++; } result = a+b+c+d; return result;}
第二种解法,掌握罗马数字书写的规律:
- 相同的数字连写、所表示的数等于这些数字相加得到的数、如:Ⅲ=3;
- 小的数字在大的数字的右边、所表示的数等于这些数字相加得到的数、 如:Ⅷ=8、Ⅻ=12;
- 小的数字(限于 I、X 和 C)在大的数字的左边、所表示的数等于大数减小数得到的数、如:Ⅳ=4、Ⅸ=9;
- 正常使用时、连写的数字重复不得超过三次;
I
V
X
L
C
D
M
1
5
10
50
100
500
1000
比如XCIX,首先判断XC,X小于C,因此是相减C-X=90,然后跳两位再进行判断,IX,10-1=9,所以XCIX表示99。
Solutions:
int toNumber(char ch) { switch (ch) { 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; default: return 0; } }int romanToInt(char* s) {int total=0; char *p=s; int i=0; int a=0; int b=0; while(p[i]!='\0') { a=toNumber(p[i]); b=toNumber(p[i+1]); if(a>=b) { total=a+total; i=i+1; } if(a<b) { total=total+b-a; i=i+2; } } return total; }
阅读全文
0 0
- [leetcode]Roman to Integer C语言
- Leetcode c语言-Integer to Roman
- Leetcode c语言-Roman to Integer
- [C++]LeetCode: 16 Roman to Integer
- [C++]LeetCode: 85 Integer to Roman
- C实现 LeetCode->Integer to Roman
- C实现 LeetCode->Roman to Integer
- 【leetcode c++】13 Roman to Integer
- [leetcode-13]Roman to Integer(C)
- LeetCode Roman to Integer && Integer to Roman
- 【leetcode】Roman to Integer | Integer to Roman
- Leetcode - "Roman to Integer" & "Integer to Roman"
- LeetCode:Roman to Integer,Integer to Roman
- LeetCode Integer to Roman & Roman to Integer
- leetcode - roman to integer & integer to roman
- LeetCode:Roman to Integer
- LeetCode: Integer to Roman
- LeetCode: Roman to Integer
- 【9月阅读计划】2017
- 死锁的定义、产生原因、必要条件、避免死锁和解除死锁的方法
- ShortcutBadger快捷方式通知
- eclipse中java project转换为java web project的方法
- 约瑟夫环
- Leetcode c语言-Roman to Integer
- Trucking HDU2962
- const、static、extern的用法
- 美国高通 Snapdragon Neural Processing Engine SDK (SNPE) 系列 (2):支持的网络层
- 微信小程序input表单页面实例,redio和下拉列表获取数据
- JAVA基础
- Linux内核学习笔记
- Elasticsearch-terms搜索及结果优化
- 模拟进程队列管理——按照优先级出列