当前位置: 首页 > article >正文

13. 罗马数字转整数

https://leetcode.cn/problems/roman-to-integer/description/?envType=study-plan-v2&envId=top-interview-150
我们显然可以总结出一这么一个规律:罗马数字如果大的数放在小的数右边就是代表这个数是减操作(最又侧的大数减左侧的小的数之和)
比如:IV=5-1=4,IX=10-1=9,XL=50-10=40, XC=100-10=90, CD=500-100=400, CM=1000-100=900,那我们这要将这些升序数找出来就行,这就可以用到我们的单调栈来解决。

class Solution {

    public static void main(String[] args) {
        String s = "IIIV";
        System.out.println(new Solution().romanToInt(s));
    }

    static HashMap<Character, Integer> map = new HashMap<Character, Integer>();

    static { //用静态代码块初始化
        map.put('I', 1);
        map.put('V', 5);
        map.put('X', 10);
        map.put('L', 50);
        map.put('C', 100);
        map.put('D', 500);
        map.put('M', 1000);
    }

    public int romanToInt(String s) {
        int res = 0, sum = 0;
        //单调增栈
        Stack<Integer> stack = new Stack<>();
        for(int i = 0; i < s.length(); i++){
            int num = map.get(s.charAt(i));
            if(stack.empty() || num > stack.peek()) {//当前数字大于前一个数字,则直接入栈
                stack.push(num);
            } else { //当前数字小于等于前一个数字,则将栈中数算出,并清空栈将当前数进栈
                sum = stack.pop();
                while(!stack.empty()) {
                    sum -= stack.pop();
                }
                res += sum;
                stack.push(num);
            }
        }
        //最后栈里面可能还有数把这些数算一下
        if(!stack.empty()) {
            sum = stack.pop();
            while(!stack.empty()) {
                sum -= stack.pop();
            }
            res += sum;
        }
        return res;
    }
}


http://www.kler.cn/a/500826.html

相关文章:

  • 牛客网刷题 ——C语言初阶(6指针)——BC105 矩阵相等判定
  • 给DevOps加点料:融入安全性的DevSecOps
  • OpenCV相机标定与3D重建(48)对三台相机进行极线校正(rectification)函数rectify3Collinear()的使用
  • 城市生命线安全综合监管平台
  • 《安富莱嵌入式周报》第348期:开源低功耗测试仪,开源创意万用表,续航100-300小时,开源PCB电机,自制shell和网络协议栈,开源水培自动化系统
  • QML states和transitions的使用
  • TypeScript Jest 单元测试 搭建
  • 使用Python和Neo4j驱动程序来实现小规模数据的CSV导入
  • 深入Android架构(从线程到AIDL)_22 IPC的Proxy-Stub设计模式04
  • GPT大模型下,如何实现网络自主防御
  • Python对接GitHub:详细操作指南
  • Docker与微服务实战2-基础篇
  • 【人工智能语音识别】——深入详解人工智能语音信号处理:理解语音信号的特征提取与表示
  • hive3后创建表默认是外部表问题
  • Spring整合SpringMVC
  • 电商项目-基于ElasticSearch实现商品搜索功能(四)
  • Kotlin 协程基础三 —— 结构化并发(二)
  • 国产3D CAD将逐步取代国外软件
  • Excel中身份证号码都变成E+乱码显示如何处理?
  • 2024 Java若依(RuoYi)框架视频教程(课件+示例代码+视频)
  • 【DevOps】Jenkins使用Pipline发布Web项目
  • WEB前端-3.1
  • 抖音矩阵是什么
  • 探索 Cloudflare Workers:高效边缘计算的新选择
  • 浅谈云计算02 | 云计算模式的演进
  • Flutter中Get.snackbar避免重复显示的实现