LeetCode刷题之旅(简单-4): 罗马数字转整数

网友投稿 280 2022-09-19

LeetCode刷题之旅(简单-4): 罗马数字转整数

2019年5月3日

目录

​​题目:​​

​​测试用例​​

​​解决方法一:使用hashMap映射键值,根据规则进行数值判断​​

​​性能结果:​​

​​小结:​​

​​解决方法二:性能确实好,但是if太多了​​

​​性能结果:​​

​​小结:​​

​​其他总结:​​

题目:

测试用例

解决方法一:使用hashMap映射键值,根据规则进行数值判断

package leetCode;import java.util.Arrays;import java.util.HashMap;/** * Date: 2019/5/3 10 :28 * */public class RomanNumeralToInteger { //匿名内部类初始化法,调用父类(非私有方法)方法,向上转型 private static HashMap romanNumberToIntegerMap = new HashMap(){{ put("I",1); put("V",5); put("X",10); put("L",50); put("C",100); put("D",500); put("M",1000); put("IV",4); put("IX",9); put("XL",40); put("XC",90); put("CD",400); put("CM",900); }}; public static int romanToInt(String s) { char[] romanNumbers = s.toCharArray(); Integer result = 0; for (int i = 0; i < romanNumbers.length ; i ++){ switch (romanNumbers[i]) { case 'I': if ((i < romanNumbers.length-1) && (romanNumbers[i + 1] == 'V' || romanNumbers[i + 1] == 'X')) { result += getIntegerValue(romanNumbers[i] , romanNumbers[i + 1]); i++; }else { result += getIntegerValue(romanNumbers[i]); } break; case 'X': if ((i < romanNumbers.length-1) && (romanNumbers[i + 1] == 'L' || romanNumbers[i + 1] == 'C')) { result += getIntegerValue(romanNumbers[i] , romanNumbers[i + 1]); i++; }else { result += getIntegerValue(romanNumbers[i]); } break; case 'C': if ((i < romanNumbers.length-1) && (romanNumbers[i + 1] == 'D' || romanNumbers[i + 1] == 'M')) { result += getIntegerValue(romanNumbers[i] , romanNumbers[i + 1]); i++; }else { result += getIntegerValue(romanNumbers[i]); } break; default: result += getIntegerValue(romanNumbers[i]); break; } } return result; } public static Integer getIntegerValue(Character... characters){ StringBuilder sb = new StringBuilder(); Arrays.stream(characters).forEach( (r) -> { sb.append(r); } ); return romanNumberToIntegerMap.get(sb.toString()); } public static void main(String[] args){ int result = romanToInt("MCMXCIV"); System.out.println("result: "+result); }}

性能结果:

小结:

我觉得封装好了一个专用方法,能提现层次感,但是由于HashMap占用更多的内存,导致性能不如意;

解决方法二:性能确实好,但是if太多了

class Solution { public int romanToInt(String s) { char[] a = s.toCharArray(); int sum = 0; for (int i = 0; i < a.length; i++) { if (i != a.length - 1) { if (a[i] == 'I' && a[i + 1] == 'V') { sum += 4; i++; continue; } if (a[i] == 'I' && a[i + 1] == 'X') { sum += 9; i++; continue; } if (a[i] == 'X' && a[i + 1] == 'L') { sum += 40; i++; continue; } if (a[i] == 'X' && a[i + 1] == 'C') { sum += 90; i++; continue; } if (a[i] == 'C' && a[i + 1] == 'D') { sum += 400; i++; continue; } if (a[i] == 'C' && a[i + 1] == 'M') { sum += 900; i++; continue; } } if (a[i] == 'I') sum += 1; if (a[i] == 'V') sum += 5; if (a[i] == 'X') sum += 10; if (a[i] == 'L') sum += 50; if (a[i] == 'C') sum += 100; if (a[i] == 'D') sum += 500; if (a[i] == 'M') sum += 1000; } return sum; }}

性能结果:

小结:

这是网友提供的解法,使用硬编码,也使用了穷举方法,对输入字符串进行一一组合判定;也许觉得代码比较冗余,但是我执行之后发现性能确是最好的;

其他总结:

String 和 Char的区别是什么?

char 定义时用 单引号 ,只能有一个字母数字,char 是一个基本类型;eg:char a='h';   //不能直接对a调用方法 String定义时用 双引号 ,可以是一个,或者多个字母 汉字等,就是所谓的字符串,String 是一个类,可以直接引用;eg:String a="hello";    //String是类,可以对对象进行调用a.charAt(0);//返回 h a.charAt(1);//返回 e

java方法的可变参数使用?

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:FAQ(69):java.lang.IllegalStateException: Cannot convert value of type ‘java.lang.String‘ to required
下一篇:后端日志(9):踏实追求
相关文章

 发表评论

暂时没有评论,来抢沙发吧~