zoukankan      html  css  js  c++  java
  • Roman to Integer问题

    Roman to Integer问题


    title:


    1.问题描述

    Given a roman numeral, convert it to an integer.Input is guaranteed to be within the range from 1 to 3999.

    {"","I","II","III","IV","V","VI","VII","VIII","IX"},
    {"","X","XX","XXX","XL","L","LX","LXX","LXXX","XC"},
    {"","C","CC","CCC","CD","D","DC","DCC","DCCC","CM"},
    {"","M","MM","MMM"}
    

    题目翻译:
    给定一个罗马数字,把这个罗马数字转换成整数,输入的数据范围1-3999

    2.解题思路

    这道题刚好和整数转罗马数字相反,那么就就可以利用相反的方法,把罗马数字所有的可能出现的情况建立一个数组,然后对各种情况进行判断,就能完成转换。在实现的时候,暴露出对java语言使用不熟悉的问题:
    1.char和String的比较
    2.substring()的范围问题
    在实现这道题的时候边界情况也调整了好久,所以在下手写代码之前,一定要把所有的情况考虑清楚,不然调bug也很懵逼,为什么会出错也要想明白。
    刚做这道题的时候,思路是一位一位的读取罗马字母,然后对特殊情况进行判断,如XC、CM,但是实现的时候对于特殊情况处理不好就放弃了,在上面的代码通过之后,我就看了排名第一的代码,也是这种思路,但是大神处理的很好,现在在代码中进行注释来说明。

    3.代码实现

    1.列举所有可能情况,进行解析

    class Solution {
        public int romanToInt(String s) {
    		int len = s.length();
    		int res = 0;
    		if(len==0||s==null)
    			res = 0;
    		int j=0;
    		String[] arr= {"M","CM","D","CD","C","XC","L","XL","X","IX","V","IV","I"};
            //数组保存所有情况
    		int [] num = {1000,900,500,400,100,90,50,40,10,9,5,4,1};
    		for(int i =0;i<len;) {
                //循环用于处理重复出现的字符
    			while(i+1<=len&&arr[j].equals(s.substring(i,i+1))) {
    				res+=num[j];
    				i++;
    			}	
                //判断避免越界	
    			if(i+2<=len) { 
                    //判断包含两个字符的情况
                    if(arr[j].equals(s.substring(i, i+2)) ) {
                        res+=num[j];
                        j++;
                        i = i+2;
                        continue;
                    }
    			}
                //防止越界,同时跳过不匹配的情况
    			if(i+1<=len && !arr[j].equals(s.substring(i,i+1))) {
    				j++;
    				continue;
    			}
    	
    			
    			
    			}
    		return res;
        }
    }
    

    2.逐位解析,处理特殊情况

    class Solution {
        public int romanToInt(String s) {
             int[] chs = new int[s.length()];
            int result = 0;
            //把多有字符代表的数值列举出来,一位一位的对应,
            //但是这里存在类似CD和DC逆序的问题
            for (int i = 0; i < chs.length; i++) {
                switch (s.charAt(i)) {
                    case 'I':
                        chs[i] = 1; break;
                    case 'V':
                        chs[i] = 5; break;
                    case 'X':
                        chs[i] = 10; break;
                    case 'L':
                        chs[i] = 50; break;
                    case 'C':
                        chs[i] = 100; break;
                    case 'D':
                        chs[i] = 500; break;
                    case 'M':
                        chs[i] = 1000; break;
                }
            }
            for (int i = 0; i < chs.length; i++){
                if ( i == chs.length - 1){
                    result += chs[i];
                } 
                else if (chs[i] < chs [i + 1]){
                    //处理顺序不同的情况
                    result = result - chs [i] ;
                } else 
                    result += chs[i];
    
            }
            return result;
        }
    }
    
  • 相关阅读:
    记一次JVM Full GC (Metadata GC Threshold)调优经历
    非root用户启动nginx
    springboot项目报错解决:ERROR StatusLogger No Log4j 2 configuration file found
    分布式锁的常见实现思路
    虚拟机安装redis及宿主机连接测试
    使用console.log打印的内容不一定可信
    《数据库系统概论》第九章笔记
    《数据库系统概论》第六章笔记
    英文论文里的缩写:e.g. etc. et al. i.e.
    英文论文里的缩写:e.g. etc. et al. i.e.
  • 原文地址:https://www.cnblogs.com/chailinbo/p/7516039.html
Copyright © 2011-2022 走看看