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

2019年5月3日java

目录app

题目:性能

测试用例​测试

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

性能结果:编码

小结:url

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

性能结果:.net

小结:code

其余总结:


题目:

测试用例

 

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

package leetCode;

import java.util.Arrays;
import java.util.HashMap;

/**
 * Date: 2019/5/3 10 :28
 *
 */

public class RomanNumeralToInteger {
    //匿名内部类初始化法,调用父类(非私有方法)方法,向上转型
    private static HashMap<String, Integer> romanNumberToIntegerMap = new HashMap<String, Integer>(){
  {
        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方法的可变参数使用?

这是JDK1.5新增语法,新特性,动态参数或者是可变参数的意思。  (1)使用…将参数声明成可变长参数。  (2)可变长参数必须是最后一个参数。  (3)可变参数同时能够跟固定的参数混合使用,可是一个方法的参数中不能同时拥有2种类型的可变参数。

相关文章
相关标签/搜索