您的位置:首页 > 编程语言 > Java开发

leetcode-java.T013_RomarToInteger 罗马数字转成整数数字

2017-06-05 01:39 507 查看
每天坚持刷leetcode----罗马数字转整数数字:

package leetcode.T013_RomarToInteger;
/**
* @Title: Solution.java
* @Package leetcode.T013_RomarToInteger
* @Description: TODO
* @author zhouzhixiang
* @date 2017-6-4 下午11:58:22
* @version V1.0
*/
public class Solution {

/**
* <pre>
* 原题
* Given a roman numeral, convert it to an integer.
* Input is guaranteed to be within the range from 1 to 3999.
*
* 题目大意
* 给定一个罗马数字,将其转换成对应的整数。
* 输入的数字在1-3999之间。
*
* 解题思路
* 根据罗马数字与整数数字对应关系进行加法操作,如果前一个数字比后一个大就相减,否则进行相加。
* </pre>
*
* @param s
* @return
*/
public static void main(String[] args) {
// int result = Solution.RomarToInteger("CXCIX");
// int result = Solution.RomarToInteger2("CXCIX");
int result = Solution.RomarToInteger3("CXCIX");
System.out.println(result);
}

/**
* <pre>
* 参考:
* 解题思路:
* 根据罗马数字与整数数字对应关系进行加法操作,如果前一个数字比后一个大
* 就相减,小就相加
*
* </pre>
*/
public static int RomarToInteger3(String str){
// I 1
// V 5
// X 10
// L 50
// C 100
// D 500
// M 1000
int result = 0;
int pre = 0;

for(int i=str.length()-1; i>=0; i--){
switch(str.charAt(i)){

case 'I':
if(1<pre){
result -= 1;
}else{
result += 1;
}
pre = 1;
break;

case 'V':
if(5<pre){
result -= 5;
}else{
result += 5;
}
pre = 5;
break;

case 'X':
if(10<pre){
result -= 10;
}else{
result += 10;
}
pre = 10;
break;

case 'L':
if(50<pre){
result -= 50;
}else{
result += 50;
}
pre = 50;
break;

case 'C':
if(100<pre){
result -= 100;
}else{
result += 100;
}
pre = 100;
break;

case 'D':
if(500<pre){
result -= 500;
}else{
result += 500;
}
pre = 500;
break;

case 'M':
if(1000<pre){
result -= 1000;
}else{
result += 1000;
}
pre = 1000;
break;

}

}

return result;
}

// I 1
// V 5
// X 10
// L 50
// C 100
// D 500
// M 1000
/**
* 错误的程序--------------比如199-CXCIX 但是出来的结果是221
* 错误原因:没有考虑到前一个数字比后一个数字大的情况,大就相减,小就相加
* @Title: RomarToInteger
* @Description: TODO
* @param @param s
* @param @return
* @return int
* @throws
*/
public static int RomarToInteger(String s){
// DLII 552
int len = s.length();
int n1 = 0;
int n5 = 0;
int n10 = 0;
int n50 = 0;
int n100 = 0;
int n500 = 0;
int n1000 = 0;
int result = 0;
String[] a = new String[len];
// String[] a = new String[]{"I","V","X","L","C","D","M"};
char[] chars = s.toCharArray();
for(int i=len-1;i>0;i--){
char c = chars[i];
String str = String.valueOf(c);
a[i] = str;
}
for(int i=0; i<len;i++){
if(s.charAt(i)=='I'){
n1++;
}
if(s.charAt(i)=='V'){
n5++;
}
if(s.charAt(i)=='X'){
n10++;
}
if(s.charAt(i)=='L'){
n50++;
}
if(s.charAt(i)=='C'){
n100++;
}
if(s.charAt(i)=='D'){
n500++;
}
if(s.charAt(i)=='M'){
n1000++;
}

}
result = result + 1000*n1000 + 500*n500 + 100*n100 + 50*n50 + 10*n10 + 5*n5 + 1*n1;

return result;
}

// 修改
public static int RomarToInteger2(String s){
// DLII 552
int len = s.length();
int n1 = 0;
int n5 = 0;
int n10 = 0;
int n50 = 0;
int n100 = 0;
int n500 = 0;
int n1000 = 0;
int result = 0;
int pre = 0;
String[] a = new String[len];
// String[] a = new String[]{"I","V","X","L","C","D","M"};
char[] chars = s.toCharArray();
for(int i=len-1;i>0;i--){
char c = chars[i];
String str = String.valueOf(c);
a[i] = str;
}

for(int i=len-1; i>=0;i--){
if(s.charAt(i)=='I'){
if(1<pre){
n1--;
}else{
n1++;
}
pre = 1;
}
if(s.charAt(i)=='V'){
if(5<pre){
n5--;
}else{
n5++;
}
pre = 5;
}
if(s.charAt(i)=='X'){
if(10<pre){
n10--;
}else{
n10++;
}
pre = 10;
}
if(s.charAt(i)=='L'){
if(50<pre){
n50--;
}else{
n50++;
}
pre = 50;
}
if(s.charAt(i)=='C'){
if(100<pre){
n100--;
}else{
n100++;
}
pre = 100;
}
if(s.charAt(i)=='D'){
if(500<pre){
n500--;
}else{
n500++;
}
pre = 500;
}
if(s.charAt(i)=='M'){
if(1000<pre){
n1000--;
}else{
n1000++;
}
pre = 1000;
}

}
result = result + 1000*n1000 + 500*n500 + 100*n100 + 50*n50 + 10*n10 + 5*n5 + 1*n1;

return result;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  leetcode RomarToInteger