【每天一道leetcode】简单 - 13. 罗马数字转整数

本文介绍如何解决LeetCode中的13题——罗马数字转整数。通过使用HashMap存储罗马数字对应的整数值,结合enum和switch,解析罗马数字字符数组,实现从罗马数字到整数的转换。在处理过程中,需要特别注意字符大小关系以及第一次循环的特殊情况,以避免错误的发生。

文章目录


用户输入罗马数字,程序输出对应的阿拉伯数字,题目具体信息见正文内链接。

题目链接:https://leetcode-cn.com/problems/roman-to-integer/

涉及到的知识:

  1. hashmap
  2. enum
  3. switch
  4. 控制台输入输出

解法一

代码

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));
        
    }
}

思路

  1. 使用HashMap存储罗马数字与阿拉伯数字的键值对,在转换方法romanToInt()中处理罗马数字到阿拉伯数字的转换,每次读取控制台输入的罗马数字并转换为字符数组,在romanToInt中循环处理字符数组中的每个字符。
  2. 使用num作为累加器,关键的判断在于,当发现当前罗马字符(例如i=4时)大于前一位(例如i=3时)罗马字符时,要在执行后一位减前一位的同时,将num中上次加上的前一位也减掉,所以算法中需要localNum - preNum*2而不是localNum - preNum。
  3. 另外还要注意的是,在第一次循环时,将累加器num和前一位preNum赋值为0(i=0时,前一位i=-1数组越界了),因为题示罗马数字中,最小位为I,所以preNum为0时,导致条件进入preNum<LocalNum,执行localNum-preNum*2,出现错误,所以要在条件判断中加入|| preNum==0的判断,这一判断只在第一次循环时有效。

日拱一卒,功不唐捐!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值