「Leetcode」13. Roman to Integer(Java)

分析

把具体的情况一个一个实现即可,没有什么幺蛾子。

代码

class Solution {
    public int romanToInt(String s) {
        int ans = 0;
        for (int i=0; i!=s.length(); ++i)
        {
            switch(s.charAt(i))
            {
                case ‘I‘:
                    if(i<s.length()-1 &&
                      (s.charAt(i+1)==‘X‘ || s.charAt(i+1)==‘V‘))
                    {
                        ans--;
                        break;
                    }
                    ans++;
                    break;
                case ‘V‘:
                    ans+=5;
                    break;
                case ‘X‘:
                    if(i<s.length()-1 &&
                      (s.charAt(i+1)==‘L‘ || s.charAt(i+1)==‘C‘))
                    {
                        ans-=10;
                        break;
                    }
                    ans+=10;
                    break;
                case ‘L‘:
                    ans+=50;
                    break;
                case ‘C‘:
                    if(i<s.length()-1 &&
                      (s.charAt(i+1)==‘D‘ || s.charAt(i+1)==‘M‘))
                    {
                        ans-=100;
                        break;
                    }
                    ans+=100;
                    break;
                case ‘D‘:
                    ans+=500;
                    break;
                case ‘M‘:
                    ans+=1000;
                    break;
                default: break;
            }
        }
        return ans;
    }
}

更好的代码

精彩的代码就是能够把所表达的意思用更少的代码跑更快的速度。以下代码无疑实现了这个目标:

class Solution {

    public static int romanToInt(String s) {
        int num = 0;
        int n = s.length();

        for (int i = 0; i < n-1; i++) {
            int curr = map(s.charAt(i));
            int next = map(s.charAt(i+1));
            num = curr < next ? num - curr : num + curr;
        }

        num += map(s.charAt(n-1));

        return num;
    }

    private static int map(char c) {
        switch(c) {
            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;
        }
    }
}

原文地址:https://www.cnblogs.com/samhx/p/LeetCode-0013.html

时间: 2024-11-11 02:59:58

「Leetcode」13. Roman to Integer(Java)的相关文章

「Leetcode」975. Odd Even Jump(Java)

分析 注意到跳跃的方向是一致的,所以我们需要维护一个数接下来跳到哪里去的问题.换句话说,就是对于一个数\(A_i\),比它大的最小值\(A_j\)是谁?或者反过来. 这里有两种方案,一种是单调栈,简单说一下思路:维护一个递减的单调栈,每次放入元素时将比它大的栈顶元素弹出(说明这些元素都能在递减的情况下都能跳到它),直到没有元素或者没有符合条件的元素位置.反过来依然,然后扫一遍就可以了. 这里采用Java的TreeMap解决问题(也就是c++的map).我们倒过来遍历一遍这个数组,那么只要Tree

Leetcode 13. Roman to Integer(python)

class Solution(object): def romanToInt(self, s): """ :type s: str :rtype: int """ l=len(s) r,i=0,0 roman={'I':1,'V':5,'X':10,'L':50,'C':100,'D':500,'M':1000,'CM':900,'CD':400,'XC':90,'XL':40,'IX':9,'IV':4} while i<l: if i&

「Leetcode」976. Largest Perimeter Triangle(C++)

分析 好久不刷题真的思维僵化,要考虑到这样一个结论:如果递增的三个数\(x_i,x_{i+1},x_{i+2}\)不符合题意,那么最大的两边之差一定大于等于第一条边,那么任何比第一条边小的都不能成立.这样一来,递增排序,然后线性找就可以了. 代码 class Solution { public: int largestPerimeter(vector<int>& A) { int ans=0; sort(A.begin(),A.end()); for(int i=A.size()-3;

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 ,即为两个并列的 1.12 写做 XII ,即为 X + II . 27 写做 XXVII, 即为 XX + V + II . 通常情况下,罗马数字中小的数字在大的数字的右边.但也存在特例,例如 4 不写做 IIII,而是 IV.数字 1 在数字 5 的左边,所表示的数等于大数 5 减小数 1 得到的数

「LuoguP1429」 平面最近点对(加强版)

题目描述 给定平面上n个点,找出其中的一对点的距离,使得在这n个点的所有点对中,该距离为所有点对中最小的 输入输出格式 输入格式: 第一行:n:2≤n≤200000 接下来n行:每行两个实数:x y,表示一个点的行坐标和列坐标,中间用一个空格隔开. 输出格式: 仅一行,一个实数,表示最短距离,精确到小数点后面4位. 输入输出样例 输入样例#1: 复制 3 1 1 1 2 2 2 输出样例#1: 复制 1.0000 说明 0<=x,y<=10^9 题解 考场清晰的记得以前听过,并且记错做法还觉得

「android」ubuntu下使用svn(转)

转自”https://yq.aliyun.com/articles/33259“ 查看系统版本: uname -a (Linux查看版本当前操作系统内核信息) cat /proc/version (Linux查看当前操作系统版本信息) 1.首先需要安装Ubuntu SVN.Ubuntu下的SVN安装十分简单,sudo apt-get install subversion,然后根据提示一步一步,就完成了Ubuntu SVN的安装: 2.检出文件(checkout). 使用命令:svn co htt

【leetcode】13. Roman to Integer

题目描述: Given a roman numeral, convert it to an integer. 解题思路: 罗马计数法有以下规则: 基本数字 Ⅰ.X .C 中的任何一个.自身连用构成数目.或者放在大数的右边连用构成数目.都不能超过三个:放在大数的左边只能用一个: 不能把基本数字 V .L .D 中的任何一个作为小数放在大数的左边采用相减的方法构成数目:放在大数的右边采用相加的方式构成数目.只能使用一个: V 和 X 左边的小数字只能用 Ⅰ: L 和 C 左边的小数字只能用X: D

[LeetCode] NO.13 Roman to Integer

[题目] Given a roman numeral, convert it to an integer. Input is guaranteed to be within the range from 1 to 3999. [题目解析] 这道题很关键的是要理解罗马数字的几个主要的代表符号和表示方式,罗马数字共有七个,即I(1),V(5),X(10),L(50),C(100),D(500),M(1000). 用来表示数字的时候,如果相邻的两个罗马数字,前面表示的数字比后面的小,那么就要减去前面的

leetCode 13. Roman to Integer 字符串

13. Roman to Integer Given a roman numeral, convert it to an integer. Input is guaranteed to be within the range from 1 to 3999. 补充:罗马数字 罗马数字共有七个,即I(1),V(5),X(10),L(50),C(100),D(500),M(1000).按照下面的规则可以表示任意正整数. 重复数次:一个罗马数字重复几次,就表示这个数的几倍. 右加左减:在一个较大的罗马数