zoukankan      html  css  js  c++  java
  • [leetcode]Integer to Roman

    整数转罗马数字,这道题目对我们中国人来说是很郁闷的,因为不熟悉。但确实也有面试官考,所以复习一下。首先罗马数字的定义参见:http://baike.baidu.com/link?url=aDx5F_QUGwk0DIbgeLxvu0YX1RDUjETI67bdJSaNxDcWCdpZVK_DH_54IIq7Z-w-

    可以看到,其实就是1~9的循环表示,用不同的字符集。那么比较容易想到的就是下面这个方法。

    public class Solution {
        public String intToRoman(int num) {
            char[] roman = new char[] {'I', 'V', 'X', 'L', 'C', 'D', 'M'};
            StringBuilder sb = new StringBuilder();
            int scale = 1000;
            for (int i = 6; i >= 0; i -= 2)
            {
                if (num == 0) break;
                int c = num / scale;           
                if (c <= 3)
                {
                    for (int j = 0 ; j < c; j++)
                    {
                        sb.append(roman[i]);
                    }
                }
                else if (c == 4)
                {
                    sb.append(roman[i]);
                    sb.append(roman[i+1]);
                }
                else if (c == 5)
                {
                    sb.append(roman[i+1]);
                }
                else if (c <= 8)
                {
                    sb.append(roman[i+1]);
                    for (int j = 0 ; j < c-5; j++)
                    {
                        sb.append(roman[i]);
                    }
                }
                else if (c == 9)
                {
                    sb.append(roman[i]);
                    sb.append(roman[i+2]);
                }
                num = num - c * scale;
                scale = scale / 10;
            }
            return sb.toString();
        }
    }
    

    除此之外,还看到这么一个方法,比较巧妙需要思考一下。其实就是从大到小试探可能性,比如拿10以内的举例:10,9,5,4,1都是坎。到不了这一级,就只能下一个,比如8,到不了9,就先放个5,剩下的3也到不了4,就只能用1来表示。

    class Solution {
    public:
        string intToRoman(int num) {
            string res;        
            string symbol[]={"M","CM","D","CD","C","XC","L","XL","X","IX","V","IV","I"};
            int value[]={1000,900,500,400,100,90,50,40,10,9,5,4,1};
            
    	    int i = 0;
    	    while(num != 0){
    		    if(num >= value[i]){    // minus largest number
    			    num -= value[i];
    		    	res += symbol[i];
    		    } else {
        	        i++;   
    		    }
    	    }
    	    return res;
        }
    };
    

      

  • 相关阅读:
    缓存
    java内存模型—先行发生原则
    Java中的阻塞队列
    java的Map
    事务传播性、隔离性与MVCC
    final修饰符
    领域驱动设计和实践
    对象转换利器之Dozer
    SharePoint Iframe 报错“此内容不能显示在一个框架中”
    使用SVG symbols建立图标系统
  • 原文地址:https://www.cnblogs.com/lautsie/p/3290581.html
Copyright © 2011-2022 走看看