Roman to Integer--Easy

罗马数字转整数算法
本文介绍了一种将罗马数字转换为整数的算法,通过分析罗马数字的构成规律,实现了快速准确的转换过程。文章提供了两种实现方案,并对比了它们的优劣,强调了使用三目运算符和减少代码冗余的重要性。

版权声明:本文为博主原创文章,未经博主允许不得转载。

一、问题描述

  Roman numerals are represented by seven different symbols: I, V, X, L, C, D and M.

  

  Given a roman numeral, convert it to an integer. Input is guaranteed to be within the range from 1 to 3999.

  意思是给你一个罗马数字,求出它所对应的整数。

二、生词

  convert  vi. /kən'vɜːt/ 转变

  guaranteed adj /'gærən'tid/ 有保证的

三、样例及说明

  

四、解题思路及代码

  认真观察罗马数字转化为整数的过程,可以得出一个规律,如果前一个罗马数字所代表的整数比后一个罗马数字所代表的整数大或者相等,那么运算的就是加法,否则是减法运算。

 1 class Solution {
 2     public int romanToInt(String s) {
 3         int sum = 0;
 4         for(int i=0; i < s.length()-1; i++) { //遍历 0-s.length()-1 的罗马数字
 5             if(wNum(s.charAt(i))>=wNum(s.charAt(i+1))) { //比后面的大或者相等用加法运算
 6                 sum += wNum(s.charAt(i));
 7             } else { //否则用减法运算
 8                 sum -= wNum(s.charAt(i));
 9             }
10         }
11         return sum+wNum(s.charAt(s.length()-1));//最后一个罗马数字一定是用加法运算
12     }
13     public int wNum(char c) {
14          switch(c) {
15             case 'I' : 
16                 return 1;
17                
18             case 'V':
19                 return 5;
20                
21             case 'X':
22                 return 10;
23                 
24             case 'L':
25                 return 50;
26                 
27             case 'C':
28                 return 100;
29                 
30             case 'D':
31                 return 500;
32                 
33             case 'M':
34                 return 1000;
35                 
36         }
37         throw new RuntimeException("invalid char");
38     }
39 }

  我看了一下这道题目前为止运行时间最快的题解,跟我的思路一样的,但是从代码上看,比我简洁多了,学习了。

 1 class Solution {
 2     
 3     public static int romanToInt(String s) {
 4         int num = 0;
 5         int n = s.length();
 6         
 7         for (int i = 0; i < n-1; i++) {
 8             int curr = map(s.charAt(i));
 9             int next = map(s.charAt(i+1));
10             num = curr < next ? num - curr : num + curr;
11         }
12         
13         num += map(s.charAt(n-1));
14         
15         return num;
16     }
17     
18     private static int map(char c) {
19         switch(c) {
20             case 'I': return 1;
21             case 'V': return 5;
22             case 'X': return 10;
23             case 'L': return 50;
24             case 'C': return 100;
25             case 'D': return 500;
26             case 'M': return 1000;
27             default: return 0;
28         }
29     }
30     
31 }

五、反思总结

  首先,三目运算符一般都可以替换 if...else语句,可以让代码更简洁美观,性能会比 if...else好一点。参考:https://blog.youkuaiyun.com/prestonzzh/article/details/52538541

  其次,代码冗余太严重了。。。得改噢!

  

  

 

转载于:https://www.cnblogs.com/crush-u-1214/p/10452917.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值