leetcode 13 Roman to Integer
解题思路:
分析题目,罗马数字转成整数
先了解罗马数字的技术规则
罗马数字 | 阿拉伯数字 |
---|---|
I | 1 |
V | 5 |
X | 10 |
L | 50 |
C | 100 |
D | 500 |
M | 1000 |
其中,I,X,C可以连用,也可放在大数的右边连用构成数目(大数字加上小数字),都不能超过三个;放在大数的左边(大数字减去小数字)只能用一个。
- 初步思路,完全按照计数规则书写
public int romanToInt(String s) {
int number = 0;
int n = s.length();
for(int i = 0;i<n;i++){
if(s.charAt(i)=='I'){
if((i != n-1)&&( s.charAt(i+1)=='V'||s.charAt(i+1)=='X')){
number--;
}else{
number++;
}
}
if(s.charAt(i)=='V'){
number+=5;
}
if(s.charAt(i)=='X'){
if((i != n-1)&&( s.charAt(i+1)=='L'||s.charAt(i+1)=='C')){
number-=10;
}else{
number+=10;
}
}
if(s.charAt(i)=='L'){
number+=50;
}
if(s.charAt(i)=='C'){
if((i != n-1)&&( s.charAt(i+1)=='D'||s.charAt(i+1)=='M')){
number-=100;
}else{
number+=100;
}
}
if(s.charAt(i)=='D'){
number+=500;
}
if(s.charAt(i)=='M'){
number+=1000;
}
}
return number;
}
- 再思考思路,将对I,X,C的规则合并处理来看,都是小数字在大数字左边表示减,在大数字右边表示加,合并考虑
public int romanToInt(String s) {
int number = 0;
int n = s.length();
int[] nums = new int[n];
for(int i = 0;i<n;i++){
switch(s.charAt(i)){
case 'I':
nums[i] = 1;
break;
case 'V':
nums[i] = 5;
break;
case 'X':
nums[i] = 10;
break;
case 'L':
nums[i] = 50;
break;
case 'C':
nums[i] = 100;
break;
case 'D':
nums[i] = 500;
break;
case 'M':
nums[i] = 1000;
break;
}
}
for(int i =0;i<n-1;i++){
if(nums[i]<nums[i+1]){
number-=nums[i];
}else{
number+=nums[i];
}
}
return number+nums[n-1];
}
- 再次,符号及所代表数字,可以思考利用map
public int romanToInt(String s) {
Map<Character,Integer> map = new HashMap<Character,Integer>();
map.put('I', 1);
map.put('V', 5);
map.put('X', 10);
map.put('L', 50);
map.put('C', 100);
map.put('D', 500);
map.put('M', 1000);
int number = 0;
for(int i =0;i<s.length()-1;i++){
if(map.get(s.charAt(i))<map.get(s.charAt(i+1))){
number-=map.get(s.charAt(i));
}else{
number+=map.get(s.charAt(i));
}
}
return number+map.get(s.charAt(s.length()-1));
}