1 题目理解
这回还是调整一下结构吧,把题目理解放前面,这样生成导语的时候方便些。
这次是两道题目一起,因为是正反对应的题,12是整数到罗马数,13是罗马数字到整数
关于第一个问题,整数到罗马,关键点在于理解罗马数的表达方式,大家可以自行搜索,或者看我给出的链接(在代码那里),我就在此基础上提示解题方法:
根据罗马数的规则,同样的罗马符号允许出现三次,且题目给定的数字也一定是合法的,那么久直接用整除+取余数来确定每个罗马符号的输出就好。。很简单
对于第二个问题,罗马数到整数,就更简单了,从头部来,直接读符号,输出就好。。
两题里面只特别提示:
1、使用static数组可以加快速度,提前放好规则
2、顺去记得搞对!特别是罗马到整数,从高部到低部(因为罗马数标表示有符号的叠加)
2 原题
Given an integer, convert it to a roman numeral.
Input is guaranteed to be within the range from 1 to 3999.
#12罗马到整数
Given a roman numeral, convert it to an integer.
Input is guaranteed to be within the range from 1 to 3999.
3 Integer to Roman
public class Solution {
/**
* 这题主要看规则。。。http://www.tuicool.com/articles/fUVNJb
* 网上找了个。。然后就是打印输出了。。呵呵嗒
* */
static int values[]={1000,900,500,400,100,90,50,40,10,9,5,4,1};
static String names[]={"M","CM","D","CD","C","XC","L","XL","X","IX","V","IV","I"};
public String intToRoman(int num) {
StringBuilder result=new StringBuilder();
int i,j;
for(i=0;i<13;i++){
for(j=0;j<num/values[i];j++)
result.append(names[i]);
num=num%values[i];
}
return result.toString();
}
}
4 Roman to Integer
public class Solution {
/**
*
* 这道题和上面也一样,本来么,用Hash+String自带的方法做也挺好的。。但毕竟这个可以看时间。。所以写个耗时短的,可能看起来也不那么短了就
*
* 原理很简单哦,和上面一样,顺着看有几个M 然后几个CM。。。,出现M就+1000,出现CM就+900,顺着来,反正只要给的不错,就算得出阿里
* */
static int values[]={1000,900,500,400,100,90,50,40,10,9,5,4,1};
static char names[][]={{'M'},{'C','M'},{'D'},{'C','D'},{'C'},{'X','C'},{'L'},{'X','L'},{'X'},{'I','X'},{'V'},{'I','V'},{'I'}};
public int romanToInt(String s) {
int result=0,i,j,k;
char chars[]=s.toCharArray();
boolean flag=false;
j=0;
i=0;
while (i<values.length){
flag=false;
for(k=0;k<names[i].length;k++){
if(j+k >= chars.length || names[i][k]!=chars[j+k])
break;
}
if(k==names[i].length){
result+=values[i];
j+=k;
} else{
i++;
}
}
return result;
}
}