title: 简单 – 13. 罗马数字转整数
date: 2020-06-30 12:41:06
tags:
- 数据结构与算法
- leetcode
categories: - 每天一道leetcode
- 简单
-
13罗马数字转整数
toc: true
用户输入罗马数字,程序输出对应的阿拉伯数字,题目具体信息见正文内链接。
题目链接:https://leetcode-cn.com/problems/roman-to-integer/
涉及到的知识:
- [hashmap]()
- [enum]()
- [switch]()
- [控制台输入输出]()
解法一
代码
import java.io.InputStream;
import java.io.IOException;
import java.util.HashMap;
import java.util.Scanner;
public class Solution {
HashMap<String,Integer> romanInt = new HashMap<>();
public Solution(){
initRomanInt();
}
private void initRomanInt(){
romanInt.put("I",1);
romanInt.put("V",5);
romanInt.put("X",10);
romanInt.put("L",50);
romanInt.put("C",100);
romanInt.put("D",500);
romanInt.put("M",1000);
}
public int romanToInt(String s) {
char[] cs = s.toCharArray();
int num = 0,preNum,localNum;
for(int i=0;i<cs.length;i++){
preNum = i==0? 0 : romanInt.get(String.valueOf(cs[i-1]));
localNum = romanInt.get(String.valueOf(cs[i]));
num = num + (preNum >= localNum||preNum==0 ? localNum : (localNum - preNum*2));
}
return num;
}
public static void main(String[] args){
String s="";
Scanner sc = new Scanner(System.in);
s=sc.nextLine();
System.out.println(new Solution().romanToInt(s));
}
}
思路
- 使用HashMap存储罗马数字与阿拉伯数字的键值对,在转换方法romanToInt()中处理罗马数字到阿拉伯数字的转换,每次读取控制台输入的罗马数字并转换为字符数组,在romanToInt中循环处理字符数组中的每个字符。
- 使用num作为累加器,关键的判断在于,当发现当前罗马字符(例如i=4时)大于前一位(例如i=3时)罗马字符时,要在执行后一位减前一位的同时,将num中上次加上的前一位也减掉,所以算法中需要localNum – preNum*2而不是localNum – preNum。
- 另外还要注意的是,在第一次循环时,将累加器num和前一位preNum赋值为0(i=0时,前一位i=-1数组越界了),因为题示罗马数字中,最小位为I,所以preNum为0时,导致条件进入preNum<LocalNum,执行localNum-preNum*2,出现错误,所以要在条件判断中加入|| preNum==0的判断,这一判断只在第一次循环时有效。
日拱一卒,功不唐捐!