• Leecode no.12 整数转罗马数字


    package com.example.demo.leecode;

    import java.util.HashMap;
    import java.util.Map;
    import java.util.Stack;

    /**
    * 整数转罗马数字
    * @Date 2020/11/27
    * @author Tang
    *
    * 罗马数字包含以下七种字符: I, V, X, L,C,D 和 M。
    *字符 数值
    * I 1
    * V 5
    * X 10
    * L 50
    * C 100
    * D 500
    * M 1000
    *
    *例如, 罗马数字 2 写做 II ,即为两个并列的 1。12 写做 XII ,即为 X + II 。 27 写做  XXVII, 即为 XX + V + II 。
    *
    * 通常情况下,罗马数字中小的数字在大的数字的右边。但也存在特例,例如 4 不写做 IIII,而是 IV。数字 1 在数字 5 的左边,所表示的数等于大数 5 减小数 1 得到的数值 4 。同样地,数字 9 表示为 IX。这个特殊的规则只适用于以下六种情况:
    *
    * I 可以放在 V (5) 和 X (10) 的左边,来表示 4 和 9。
    * X 可以放在 L (50) 和 C (100) 的左边,来表示 40 和 90。 
    * C 可以放在 D (500) 和 M (1000) 的左边,来表示 400 和 900。
    * 给定一个整数,将其转为罗马数字。输入确保在 1 到 3999 的范围内
    *
    */
    public class IntegerToRoman {

    /**
    * 思路:
    * 先定义出1到3999范围内,所会涉及到的所有罗马数字组合
    * *字符 数值
    * * I 1 CM 900
    * * V 5 CD 400
    * * X 10 XC 90
    * * L 50 XL 40
    * * C 100 IX 9
    * * D 500 IV 4
    * * M 1000
    *
    * 贪心算法思想 从最高位开始,选择出最低位适用的罗马数字
    * 然后再除掉最低位,依次判断余数的罗马数字,直到余数为0
    *
    * @param num
    * @return
    */
    public String intToRoman(int num){
    Map<Integer, String> romanMap = new HashMap(15);
    romanMap.put(1,"I");
    romanMap.put(4,"IV");
    romanMap.put(5,"V");
    romanMap.put(9,"IX");
    romanMap.put(10,"X");
    romanMap.put(40,"XL");
    romanMap.put(50,"L");
    romanMap.put(90,"XC");
    romanMap.put(100,"C");
    romanMap.put(400,"CD");
    romanMap.put(500,"D");
    romanMap.put(900,"CM");
    romanMap.put(1000,"M");

    //用一个栈用来逆序保存罗马字符
    Stack<String> stack = new Stack<>();

    //n 1 10 100 1000
    int n = 1;
    while(num != 0){
    //temp 是 n位的数 num = 567 temp = 7 60 500
    int temp = num % (n*10);

    //bt 是 n位的数字 num = 567 bt = 7 6 5
    int bt = temp / n;

    //如果能从map直接找到temp 直接入栈
    //否则进行拆解 判断temp对应的罗马数字
    //只有两种情况在map里获取不到 2n - 3n 6n - 8n
    if(romanMap.get(temp) != null){
    stack.push(romanMap.get(temp));
    }else if(bt == 2 || bt == 3){
    for(int i = 0; i < bt; i++){
    stack.push(romanMap.get(n));
    }
    }else if(bt >= 6 && bt <= 8){
    //现把'5'后边的'1'入队 再把'5'入队
    for(int i = 0; i < bt - 5; i++){
    stack.push(romanMap.get(n));
    }
    stack.push(romanMap.get(5 * n));
    }else{
    //temp为0 不计算
    }
    num = num - temp;
    n = n*10;
    }

    StringBuilder stringBuilder = new StringBuilder();
    while(stack.size() != 0){
    stringBuilder.append(stack.pop());
    }
    return stringBuilder.toString();
    }


    public static void main(String[] args) {
    System.out.println(new IntegerToRoman().intToRoman(3001));

    }


    }
  • 相关阅读:
    jvm系列(八):jvm知识点总览-高级Java工程师面试必备
    jvm系列(七):jvm调优-工具篇
    JVM学习(2)——技术文章里常说的堆,栈,堆栈到底是什么,从os的角度总结
    Java ClassLoader详解
    语言堆栈入门——堆和栈的区别
    kubernetes基本了解
    软编码和硬编码的理解
    前台页面传日期类型后台接收问题
    mybatis-plus简单了解
    二叉树基础知识
  • 原文地址:https://www.cnblogs.com/ttaall/p/14048062.html
Copyright © 2020-2023  润新知