zoukankan      html  css  js  c++  java
  • 13.Roman to Integer


    本人想法比较简单

    class Solution {
     
    	public int romanToInt(String s) {
    		char arr[] = new char[s.length() + 1];//定义一个一维数组存放数据
    		for (int i = 0; i < s.length(); i++) {//将输入的字符串遍历一遍
    			arr[i] = s.charAt(i);
    		}
    		
    		int sum = 0;
    		for (int i = 0; i < s.length(); i++) {//判断一个或者两个罗马数字的所对应的值 并加上去
    			if (arr[i] == 'M') {
    				sum = sum+1000;
    			} else if (arr[i] == 'C') {
    				if (arr[i + 1] == 'M') {
    					sum = sum+900;
    					i++;
    				} else if (arr[i + 1] == 'D') {
    					sum = sum+400;
    					i++;
    				} else {
    					sum = sum+100;
    				}
    			} else if (arr[i] == 'D') {
    				sum = sum+500;
    			} else if (arr[i] == 'X') {
    				if (arr[i + 1] == 'C') {
    					sum = sum+90;
    					i++;
    				} else if (arr[i + 1] == 'L') {
    					sum = sum+40;
    					i++;
    				} else {
    					sum = sum+10;
    				}
    			} else if (arr[i] == 'L') {
    				sum = sum+50;
    			} else if (arr[i] == 'I') {
    				if (arr[i + 1] == 'X') {
    					sum = sum+9;
    					i++;
    				} else if (arr[i + 1] == 'V') {
    					sum = sum+4;
    					i++;
    				} else {
    					sum = sum+1;
    				}
    			} else if (arr[i] == 'V') {
    				sum =sum +5;
    			}
    		}
    		return sum;
    	}
    	
    }
    

    其他大神的解法 我一步一步分析
    case语句解法

    public int romanToInt(String s) {
    		int n = s.length();
    		int roman_int = 0;
    		for(int i=0;i<n;i++)
    		{
    			switch(s.charAt(i)) //定义一个case 语句块
    			{
    			case 'I' : roman_int = roman_int + 1;break;
    			case 'V' : roman_int = roman_int + 5;break;
    			case 'X' : roman_int = roman_int + 10;break;
    			case 'L' : roman_int = roman_int + 50;break;
    			case 'C' : roman_int = roman_int + 100;break;
    			case 'D' : roman_int = roman_int + 500;break;
    			case 'M' : roman_int = roman_int + 1000;break;
    			default: System.out.println("default");break;
    			}
     
    			if(i!=0)
    			{
    				if(((s.charAt(i)=='V')||(s.charAt(i)=='X'))&&(s.charAt(i-1)=='I')) 
    					roman_int = roman_int-1*2;
    				if(((s.charAt(i)=='L')||(s.charAt(i)=='C'))&&(s.charAt(i-1)=='X'))
    					roman_int = roman_int-10*2;
    				if(((s.charAt(i)=='D')||(s.charAt(i)=='M'))&&(s.charAt(i-1)=='C'))
    					roman_int = roman_int-100*2;
    			}
    		}
    		return roman_int;
    	}
    

    hash码

    class Solution 
    {
        public int romanToInt(String s)
        {//制作一个hash表
            HashMap<Character, Integer> map = new HashMap<Character, Integer>()
            {{
                put('I', 1);
                put('V', 5);
                put('X', 10);
                put('L', 50);
                put('C', 100);
                put('D', 500);
                put('M', 1000);
            }};
            
            int sum = map.get(s.charAt(s.length() - 1));
            
            for(int i = s.length() - 2; i >= 0; i--)
            {
                if(map.get(s.charAt(i)) < map.get(s.charAt(i + 1)))
                {
                    sum -= map.get(s.charAt(i));
                }
                else
                {
                    sum += map.get(s.charAt(i));
                }
            }
            return sum;
        }
    }
    
    class Solution {
     
     public int letterToInteger(char letter) { 
      switch(letter) {
      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;
      }
     }
     
     public int romanToInt(String s) {  //解析罗马数字
    String str = s.toUpperCase();
    		char[] roman = str.toCharArray();
    		int all = 0;
    		int i = 0;
    		while (true) {
    			if (i >= roman.length - 1) {
    				all += letterToInteger(roman[i]);
    				break;
    			}
    			else if (i < roman.length - 1) {
    				int currentNum = letterToInteger(roman[i]);
    				int nextNum = letterToInteger(roman[i + 1]); // 越界!!! 仅输入一个 D 报错 已改
    				if (currentNum >= nextNum) {
    					all += (currentNum);
    					i += 1;                                                       //一个一个加
    				} else {
    					all += (nextNum - currentNum); // 若当前字母比下一个字母小,则下一个字母表示数字减去当前字母表示的数字
    					i += 2;
    				}
    				if (i == roman.length - 1) { // 如果下标已经移动到最后一位字母,那么all直接加上这个字母表示的数字
    					all += letterToInteger(roman[roman.length - 1]);
    					break; // 循环结束
    				}
    				if (i > roman.length - 1) // 如果下标已经超出字符组范围,循环结束
    					break;
    			}
    		}
    		return all;
    	}
    }
    
  • 相关阅读:
    题解 P3717 【[AHOI2017初中组]cover】
    【题解】 [POI2012]FES-Festival (差分约束)
    【题解】 [HNOI2005]狡猾的商人(差分约束)
    【题解】 [SCOI2011]糖果 (差分约束)
    【题解】 POJ 1201 Intervals(差分约束)
    【题解】 Codeforces 919F A Game With Numbers(拓扑排序+博弈论+哈希)
    【题解】 [ZJOI2012]灾难 (拓扑排序+LCA)
    【题解】 [HAOI2016]食物链 (拓扑排序)
    【题解】 Luogu P1402 酒店之王 (二分图匹配)
    【题解】 [NOI2009]变换序列 (二分图匹配)
  • 原文地址:https://www.cnblogs.com/cznczai/p/11150532.html
Copyright © 2011-2022 走看看