zoukankan      html  css  js  c++  java
  • 罗马数字转整数(leetcode-13)

    题目

    static int[] values = {1000,900,500,400,100,90,50,40,10,9,5,4,1};
    static String[] symbols = {"M","CM","D","CD","C","XC","L","XL","X","IX","V","IV","I"};

    通常情况下,罗马数字中小的数字在大的数字的右边。IV表示4。

    给定一个罗马数字,将其转换成整数。输入确保在 1 到 3999 的范围内。

    输入: "III"
    输出: 3

    分析:

    方法一:

    由题意,把一个小值放在大值的左边,就是做减法,否则为加法。

    在代码实现上,可以往后看多一位,对比当前位与后一位的大小关系,从而确定当前位是加还是减法。当没有下一位时,做加法即可。

    代码如下:

    import java.util.*;
    
    class Solution {
        public int romanToInt(String s) {
            int sum = 0;
            int preNum = getValue(s.charAt(0));
            for(int i = 1;i < s.length(); i ++) {
                int num = getValue(s.charAt(i));
                if(preNum < num) {
                    sum -= preNum;
                } else {
                    sum += preNum;
                }
                preNum = num;
            }
            sum += preNum;
            return sum;
        }
        
        private int getValue(char ch) {
            switch(ch) {
                case 'I': return 1;
                case 'V': return 5;
                case 'X': return 10;
                case 'L': return 50;
                case 'C': return 100;
                case 'D': return 500;
                case 'M': return 1000;
                default: return 0;
            }
        }
    }

    方法二:

    首先将所有的组合可能性列出并添加到哈希表中
    然后对字符串进行遍历,由于组合只有两种,一种是 1 个字符,一种是 2 个字符,其中 2 个字符优先于 1 个字符,
    先判断两个字符的组合在哈希表中是否存在,存在则将值取出加到结果 ans 中,并向后移2个字符。

    不存在则将判断当前 1 个字符是否存在,存在则将值取出加到结果 ans 中,并向后移 1 个字符
    遍历结束返回结果 ans。

    代码如下:

        public int romanToInt(String s) {
            Map<String, Integer> map = new HashMap<>();
            map.put("I", 1);
            map.put("IV", 4);
            map.put("V", 5);
            map.put("IX", 9);
            map.put("X", 10);
            map.put("XL", 40);
            map.put("L", 50);
            map.put("XC", 90);
            map.put("C", 100);
            map.put("CD", 400);
            map.put("D", 500);
            map.put("CM", 900);
            map.put("M", 1000);
            
            int ans = 0;
            for(int i = 0;i < s.length();) {
                if(i + 1 < s.length() && map.containsKey(s.substring(i, i+2))) {
                    ans += map.get(s.substring(i, i+2));
                    i += 2;
                } else {
                    ans += map.get(s.substring(i, i+1));
                    i ++;
                }
            }
            return ans;
        }

    最后,附上我写的

    有些地方有多余,也是第二种方法的思路

    public class leetcode13 {
    
        static String twoLetterStart = "CXI";
        static Map<String,Integer> twoRoman = new HashMap();
        static Map<String,Integer> oneRoman = new HashMap();
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            twoRoman.put("CM", 900);
            twoRoman.put("CD", 400);
            twoRoman.put("XC", 90);
            twoRoman.put("XL", 40);
            twoRoman.put("IX", 9);
            twoRoman.put("IV", 4);
            
            oneRoman.put("M", 1000);
            oneRoman.put("D", 500);
            oneRoman.put("C", 100);
            oneRoman.put("L", 50);
            oneRoman.put("X", 10);
            oneRoman.put("V", 5);
            oneRoman.put("I", 1);
            
            Scanner in = new Scanner(System.in);
            while(in.hasNext()){
                String str = in.nextLine();
                int result = romainToInt(str);
                System.out.println(result);
            }
        }
        
        
        public static int romainToInt(String s){
            int sum =0;
            StringBuilder sb = new StringBuilder(s);
            for(int i=0;i<s.length();i++){
                char letter = s.charAt(i);
                if(twoLetterStart.indexOf(letter)>=0&&i!=(s.length()-1)){
                    String tmp = sb.substring(i, i+2);
                    if(twoRoman.containsKey(tmp)){
                        sum += twoRoman.get(tmp);
                        i++;
                        continue;
                    }
                }
                
                sum += oneRoman.get(String.valueOf(letter));
            }
            return sum;
        }
    
    }
  • 相关阅读:
    数位dp模板
    HDU
    hdu 2586 How far away ? ( 离线 LCA , tarjan )
    POJ 1655 Balancing Act( 树的重心 )
    HDU 2196 Computer( 树上节点的最远距离 )
    HDU 5266 pog loves szh III ( LCA + SegTree||RMQ )
    HDU 5265 pog loves szh II
    2015区域赛起航
    2015GDCPC广东省赛总结
    SGU 521 North-East ( 二维LIS 线段树优化 )
  • 原文地址:https://www.cnblogs.com/Vincent-yuan/p/14328034.html
Copyright © 2011-2022 走看看