zoukankan      html  css  js  c++  java
  • 12. Integer to Roman (HashTable)

    Given an integer, convert it to a roman numeral.

    Input is guaranteed to be within the range from 1 to 3999.

     思路:罗马数字共有七个,即I(1),V(5),X(10),L(50),C(100),D(500),M(1000)。

    第一步,按照千分位,百分位...一一算下来。

    class Solution {
    public:
        string intToRoman(int num) {
            int quote;
            int residue;
            string ret = "";
            
            //first deal with 10^3
            quote = num/1000;
            residue = num%1000;
            while(quote > 0){
                ret += 'M';
                quote--;
            }
            
            //then deal with 10^2
            quote = residue/100;
            residue %= 100;
            if(quote==9){
                ret += "CM";
            }
            else if(quote >=5){
                ret += 'D';
                while(quote > 5){
                    ret += 'C';
                    quote--;
                }
            }
            else if(quote==4){
                ret += "CD";
            }
            else{
                while(quote > 0){
                    ret += 'C';
                    quote--;
                }
            }
            
            //then deal with 10
            quote = residue/10;
            residue %= 10;
            if(quote==9){
                ret += "XC";
            }
            else if(quote >=5){
                ret += 'L';
                while(quote > 5){
                    ret += 'X';
                    quote--;
                }
            }
            else if(quote==4){
                ret += "XL";
            }
            else{
                while(quote > 0){
                    ret += 'X';
                    quote--;
                }
            }
            
            //finally deal with 1
            quote = residue;
            if(quote==9){
                ret += "IX";
            }
            else if(quote >=5){
                ret += 'V';
                while(quote > 5){
                    ret += 'I';
                    quote--;
                }
            }
            else if(quote==4){
                ret += "IV";
            }
            else{
                while(quote > 0){
                    ret += 'I';
                    quote--;
                }
            }
            
            return ret;
        }
    };

    第二步,代码有冗余,将其归纳整合。并且用减法代替除法!

    class Solution {
    public:
        string intToRoman(int num) {
            int values[] = {1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1 }; //数组的初始化
            string numerals[] = {"M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I" };
            int size = sizeof(values) / sizeof(values[0]); //获取数组的大小
            string result = "";
    
            for (int i = 0; i < size; i++) {
                while (num >= values[i]) {
                    num -= values[i];
                    result+=numerals[i];
                }
            }
            return result;
        }
    };
  • 相关阅读:
    长为N的数组,元素范围是0-N-1,其中只有一个数是重复的,找出这个重复元素
    KMP算法
    最长公共子序列,最长公共字串,最长递增子序列
    马走日字问题
    URL详解
    分辨率、像素和PPI
    输入一棵二叉树,判断该二叉树是否是平衡二叉树。
    返回值递归问题
    图像几何变换:旋转,缩放,错切
    数据库事务的四大特性以及事务的隔离级别
  • 原文地址:https://www.cnblogs.com/qionglouyuyu/p/4663266.html
Copyright © 2011-2022 走看看