Given a roman numeral, convert it to an integer.
Input is guaranteed to be within the range from 1 to 3999.
Given an integer, convert it to a roman numeral.
Input is guaranteed to be within the range from 1 to 3999.
这两道题是对应的,所以写到一起。罗马数字都知道,就是我们写论文的时候目录用的页面就是这个东西,具体看Wiki。
罗马数字转换阿拉伯数字,比较简单,下面的程序中使用了两种数据结构,数组的实现方式效率更高,所以有时候选择合适的数据结构很重要。
public class Solution {
public int romanToInt(String s) {
/**
Map<String, Integer> hashMap=new HashMap<String, Integer>();
hashMap.put("I",1);
hashMap.put("V",5);
hashMap.put("X",10);
hashMap.put("L",50);
hashMap.put("C",100);
hashMap.put("D",500);
hashMap.put("M",1000);
char[] roman=s.toCharArray();
int sum=hashMap.get(String.valueOf(roman[0]));
for (int i = 0; i < roman.length-1; i++) {
if(hashMap.get(String.valueOf(roman[i]))>=hashMap.get(String.valueOf(roman[i+1]))){
sum=sum+hashMap.get(String.valueOf(roman[i+1]));
}else {
sum=sum+hashMap.get(String.valueOf(roman[i+1]))-2*hashMap.get(String.valueOf(roman[i]));
}
}
return sum;
**/
int graph[] = new int[400];
graph['I'] = 1;
graph['V']=5;
graph['X']=10;
graph['L']=50;
graph['C']=100;
graph['D']=500;
graph['M']=1000;
char[] num = s.toCharArray();
// 遍历这个数,用sum来总计和
int sum = graph[num[0]];
for(int i=0; i<num.length-1; i++){
// 如果,i比i+1大的话,直接相加
if(graph[num[i]] >= graph[num[i+1]]){
sum += graph[num[i+1]];
}
// 如果i比i+1小的话,则将总和sum减去i这个地方数的两倍,同时加上i+1
// 就相当于后边的数比左边的数大,则用右边的数减左边的数
else{
sum = sum + graph[num[i+1]] - 2*graph[num[i]];
}
}
return sum;
}
}
阿拉伯数字到罗马数字的时候代码有点绕,这里定义了两个数组,找到对应关系即可。
public class Solution {
public String intToRoman(int num) {
int[] numArray={1000,900,500,400,100,90,50,40,10,9,5,4,1};
String[] romanArray={"M","CM","D","CD","C","XC","L","XL","X","IX","V","IV","I"};
String romanStr="";
for (int i = 0; i < numArray.length; i++) {
while (num>=numArray[i]) {
romanStr=romanStr+romanArray[i];
num=num-numArray[i];
}
}
return romanStr;
}
}