问题描述:

Given a roman numeral, convert it to an integer.

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

算法:

/**
* 输入一个罗马数字,返回它的整型表示
* @author admin
* 转换规则:从右向左或者从左向右遍历均可
* 1 相同数字连写,相加 ;2 小数字在大数字右边,相加;3 小数字在大数字左边,大的减去小的
*/

方法一:hashmap 从右向左遍历

//将罗马数字转换为整型值
public static int romanToInt(String s){
    HashMap<Character, Integer> roma_weight = new HashMap<Character, Integer>();
    roma_weight.put('I', 1);
    roma_weight.put('V', 5);
    roma_weight.put('X',10);
    roma_weight.put('L', 50);
    roma_weight.put('C', 100);
    roma_weight.put('D',500);
    roma_weight.put('M',1000);
    char[] roma = s.toCharArray(); //将罗马数字转化为字符数组
    int length = roma.length;
    int preValue = 0; //前一步的value
    int value = roma_weight.get(roma[length - 1]) ;// 当前的value     //从右向左遍历
    for(int i = length - 2; i >= 0 ; i--){
      //小的数字在大数字右边,直接相加
      if( roma_weight.get(roma[i]) >= roma_weight.get(roma[i + 1])) {
        preValue = value;
        value = value + roma_weight.get(roma[i]);
      }
      else { //小的数字在大数字左边,大的减去小的
        value = preValue + roma_weight.get(roma[i + 1]) - roma_weight.get(roma[i]);
      }
    }
    return value;
}

方法二:switch case,从左向右遍历

//与第一种方法基本相同,从左向右
public static int romanToInt1(String s) {
  char[] ss = s.toCharArray();
  int ret = toNumber(ss[0]);
  for (int i = 1; i < ss.length; i++) {
    if (toNumber(ss[i - 1]) < toNumber(ss[i])) {
      //ret - toNumber(ss[i - 1]) = preValue; 然后再进行 preValue + toNumber(ss[i]) - toNumber(ss[i - 1]);
      ret += toNumber(ss[i]) - 2 * toNumber(ss[i - 1]); //相当于方法一中的 preValue + roma_weight.get(roma[i + 1]) - roma_weight.get(roma[i]);
    } else {
      ret += toNumber(ss[i]);
   }
}
return ret;
} //罗马数字权重表,没有空间复杂度,较hashmap要好一些
public static int toNumber(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;
  }
  return 0;
}

Roman To Integer leetcode java的更多相关文章

  1. 「Leetcode」13. Roman to Integer(Java)

    分析 把具体的情况一个一个实现即可,没有什么幺蛾子. 代码 class Solution { public int romanToInt(String s) { int ans = 0; for (i ...

  2. Roman to Integer -- LeetCode 13

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

  3. Roman to Integer [LeetCode]

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

  4. 13. Roman to Integer (JAVA)

    Roman numerals are represented by seven different symbols: I, V, X, L, C, D and M. Symbol Value I 1 ...

  5. Reverse Integer LeetCode Java

    Reverse digits of an integer. Example1: x = 123, return 321Example2: x = -123, return -321 public cl ...

  6. LeetCode 13. 罗马数字转整数(Roman to Integer)

    13. 罗马数字转整数 13. Roman to Integer 题目描述 罗马数字包含以下七种字符: I,V,X,L,C,D 和 M. 字符        数值  I           1  V  ...

  7. [LeetCode][Python]Roman to Integer

    # -*- coding: utf8 -*-'''__author__ = 'dabay.wang@gmail.com'https://oj.leetcode.com/problems/roman-t ...

  8. Leetcode#13. Roman to Integer(罗马数字转整数)

    题目描述 罗马数字包含以下七种字符:I, V, X, L,C,D 和 M. 字符 数值 I 1 V 5 X 10 L 50 C 100 D 500 M 1000 例如, 罗马数字 2 写做 II ,即 ...

  9. LeetCode: Roman to Integer 解题报告

    Roman to IntegerGiven a roman numeral, convert it to an integer. Input is guaranteed to be within th ...

随机推荐

  1. 利用mysql行级锁创建数据库主键id

    存储函数: CREATE FUNCTION `getSerialNo`(`serialName` VARCHAR(50), `skip` INT) RETURNS bigint(20) COMMENT ...

  2. Termux 一款安卓终端模拟器

    Termux官网 https://termux.com/ 用处 提供了一个类似于Linux终端的界面,可以使用apt安装程序.目前我在上面跑了我以前写的一些爬虫脚本,运行完全没有问题. 玩法 玩法还是 ...

  3. python反爬虫解决方法——模拟浏览器上网

    之前第一次练习爬虫的时候看网上的代码有些会设置headers,然后后面的东西我又看不懂,今天终于知道了原来这东西是用来模拟浏览器上网用的,因为有些网站会设置反爬虫机制,所以如果要获取内容的话,需要使用 ...

  4. BZOJ 1070: [SCOI2007]修车(费用流)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1070 题意: 思路: 神奇的构图. 因为排在后面的人需要等待前面的车修好,这里将每个技术人员拆成n个 ...

  5. ASP.NET —— Web Pages

    为简单起见,新建一个空的web工程,再新建一个MVC的视图(.cshtml),因为WP是单页面模型,所以以后就在这个页面中进行试验. Razor语法简介: 变量可用var或者其确切类型声明. 遍历fo ...

  6. 在GeoServer里设置图层的默认自定义样式,出现不显示预览图的情况(不起作用)

    在GeoServer里设置图层的默认自定义样式 点击"Layers-->world:country"图层,点击"Publishing"标签,在下面的&qu ...

  7. 细菌多位点序列分型(Multilocus sequence typing,MLST)的原理及分型方法

    摘 要: 多位点序列分型(MLST)是一种基于核酸序列测定的细菌分型方法,通过PCR扩增多个管家基因内部片段,测定其序列,分析菌株的变异,从而进行分型.MLST被广泛应用于病原菌.环境菌和真核生物中. ...

  8. python 安装pip

    https://pip.pypa.io/en/stable/installing/

  9. 给大一新生学习c程序的一些建议的一些建议

    这是一篇给刚学习c程序的学弟们的一篇日志.如果想学好c程序,以及不想走太多弯路,希望能看一下这篇文章,如果说基础较好,或者说已经是大二,大三,这篇文章不会有什么帮助. 刚转到软件工程系,加了几个新生群 ...

  10. django表单的Widgets

    不要将Widget与表单的fields字段混淆.表单字段负责验证输入并直接在模板中使用.而Widget负责渲染网页上HTML表单的输入元素和提取提交的原始数据.widget是字段的一个内在属性,用于定 ...