首页 > 其他分享 >13_罗马数字转整数

13_罗马数字转整数

时间:2024-09-09 20:46:18浏览次数:12  
标签:13 int symbolValues value 罗马数字 整数 ans put

13_罗马数字转整数

【问题描述】

罗马数字包含以下七种字符: IVXLCDM

字符          数值
I             1
V             5
X             10
L             50
C             100
D             500
M             1000

例如, 罗马数字 2 写做 II ,即为两个并列的 1 。12 写做 XII ,即为 X + II27 写做 XXVII, 即为 XX + V + II

通常情况下,罗马数字中小的数字在大的数字的右边。但也存在特例,例如 4 不写做 IIII,而是 IV。数字 1 在数字 5 的左边,所表示的数等于大数 5 减小数 1 得到的数值 4 。同样地,数字 9 表示为 IX。这个特殊的规则只适用于以下六种情况:

  • I 可以放在 V (5) 和 X (10) 的左边,来表示 4 和 9。
  • X 可以放在 L (50) 和 C (100) 的左边,来表示 40 和 90。
  • C 可以放在 D (500) 和 M (1000) 的左边,来表示 400 和 900。

给定一个罗马数字,将其转换成整数。

示例一:
输入: s = "III"
输出: 3

【算法设计思想】

本题的解决关键是如何应用映射关系,例如如何解处理字符"I"所对应的1这个问题。在C++中,我们可以使用unordered_map这个容器,在Java中我们可以使用HashMap这种容器,在Python中我们使用字典,在C语言中,我们可以利用不同字母的ASCII值来构建一个"哈希表",然后我们遍历这个字符串即可。同时在遍历的时候,我们需要注意当前字符和下一个字符所对应的数字的大小关系

【算法描述】

C++:

class Solution {
private:
    unordered_map<char, int> symbolValues = {
        {'I', 1},
        {'V', 5},
        {'X', 10},
        {'L', 50},
        {'C', 100},
        {'D', 500},
        {'M', 1000},
    };

public:
    int romanToInt(string s) {
        int ans = 0;
        int n = s.length();
        for (int i = 0; i < n; ++i) {
            int value = symbolValues[s[i]];
            if (i < n - 1 && value < symbolValues[s[i + 1]]) {
                ans -= value;
            } else {
                ans += value;
            }
        }
        return ans;
    }
};


Java:

class Solution {
    Map<Character, Integer> symbolValues = 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);
    }};

    public int romanToInt(String s) {
        int ans = 0;
        int n = s.length();
        for (int i = 0; i < n; ++i) {
            int value = symbolValues.get(s.charAt(i));
            if (i < n - 1 && value < symbolValues.get(s.charAt(i + 1))) {
                ans -= value;
            } else {
                ans += value;
            }
        }
        return ans;
    }
}


Python:

class Solution:

    SYMBOL_VALUES = {
        'I': 1,
        'V': 5,
        'X': 10,
        'L': 50,
        'C': 100,
        'D': 500,
        'M': 1000,
    }

    def romanToInt(self, s: str) -> int:
        ans = 0
        n = len(s)
        for i, ch in enumerate(s):
            value = Solution.SYMBOL_VALUES[ch]
            if i < n - 1 and value < Solution.SYMBOL_VALUES[s[i + 1]]:
                ans -= value
            else:
                ans += value
        return ans


C:

int romanToInt(char* s) {
    int symbolValues[26];
    symbolValues['I' - 'A'] = 1;
    symbolValues['V' - 'A'] = 5;
    symbolValues['X' - 'A'] = 10;
    symbolValues['L' - 'A'] = 50;
    symbolValues['C' - 'A'] = 100;
    symbolValues['D' - 'A'] = 500;
    symbolValues['M' - 'A'] = 1000;
    int ans = 0;
    int n = strlen(s);
    for (int i = 0; i < n; ++i) {
        int value = symbolValues[s[i] - 'A'];
        if (i < n - 1 && value < symbolValues[s[i + 1] - 'A']) {
            ans -= value;
        } else {
            ans += value;
        }
    }
    return ans;
}


标签:13,int,symbolValues,value,罗马数字,整数,ans,put
From: https://www.cnblogs.com/zeta186012/p/18405308

相关文章

  • chapter13-常用类——(Date、Calendar、LocalDate)—day17
    目录488-Date介绍489-Date应用实例490-Calendar介绍491-Calendar应用实例492-第三代日期使用493-第三代日期方法494-String翻转495-注册处理题496-字符串统计497-String内存布局测试题488-Date介绍IDEA里面的properties是set/get方法489-Date应用实例4......
  • python知识点100篇系列(13)-几种方法让你的电脑一直在工作
    写在前面:如果只想设置电脑永不息屏,可以在电脑的右下角,电源设置中的电源选项,设置成不熄灭屏幕即可;不需要依靠其他工具,但是这个也只能让电脑不息屏,其他也干不了;这里文章说的电脑一直在工作,是指使用python自动操作鼠标或键盘来使得电脑一直不息屏;第一种,可以使用pyautogui:......
  • 掌握 13 个页面 SEO 优化要素,轻松提升网站排名
    页面SEO通过优化网站各个部分来帮助搜索引擎抓取和理解页面,提高搜索排名。除了内容,网站速度、移动设备友好性等因素也很重要。页面SEO不仅能提高点击率和访问量,还能提升品牌可信度,是其他SEO工作的基础,如建立链接等。以下我将介绍13个关键的页面SEO元素,从E-E-A-T......
  • TMC5130—瑞士公司Thermoplan成功的基石
    瑞士的咖啡企业Thermoplan自1999年到现在就以开发设计和加工制作星巴克选用的咖啡机而广为人知,它生产制造的全自动化咖啡机在煮咖啡时近乎没有人为异常的空间。现今,凭借将独具匠心与最新技术相融在一起,任何一个杯子都将称得上Black&White4和LatteArtist锦上添花的精致冲泡产品。......
  • SCI论文审稿的13种状态详解
    SCI论文审稿的13种状态1.Submittedtojournal(稿件提交)代表文章提交成功。在这一阶段,需要作者确认自己所提交的文件是否符合期刊的投稿要求,包括格式、内容、摘要、参考文献等,同时也要留意期刊的审核时间和流程。2.ManuscriptreceivedbyEditorialoffice(收到稿件......
  • 大整数运算
    首先是遇到了1017A除以B,稀里糊涂地复制了别人的答案就将其抛在脑后(偶然事件),紧接着就遇到了1022D进制的A+B,这时突然记起学习要有打破砂锅问到底的精神,根本不是因为发现这个问题逃避不了,开始了对这个知识点的研究学习。取余运算取余就是取模,可以将其转换为对字符串中的最低数......
  • 南沙信奥赛C++陈老师解一本通题: 1326:【例7.5】 取余运算(mod)
    ​【题目描述】【输入】输入b,p,k的值。【输出】【输入样例】2109【输出样例】2^10mod9=7 #include<iostream>#include<stdlib.h>usingnamespacestd;longlongb,p,k,ans=1;intmain(){ cin>>b>>p>>k; for(inti=1;i<=p;i++) { ans*=b;......
  • 南沙信奥赛C++陈老师解一本通题: 1171:大整数的因子
    ​ 【题目描述】已知正整数k满足2≤k≤9,现给出长度最大为30位的十进制非负整数c,求所有能整除c的k。【输入】一个非负整数c,c的位数≤30。【输出】若存在满足 c%k==0的k,从小到大输出所有这样的k,相邻两个数之间用单个空格隔开;若没有这样的k,则输出"none"。【输入样......
  • BZOJ 1396 识别子串 题解
    Statement给\(S\),令\(x\)为\(S\)的第\(k\)个字符,称\(T=S[i..j]\)为关于\(x\)的识别子串,当且仅当:\(i\lek\lej\)(含\(x\)这一位)\(T\)在\(S\)中只出现一次求\(S\)关于每一位字符的最短识别子串长度,\(|S|\le10^5\).Solution1以下是我没看题解瞎胡的首先......
  • ARC138 B - 01 Generation 题解
    ARC138B-01Generation思路考虑逆向思维,很容易想到可以优先从后面删掉0(操作B的逆向操作),然后如果前面是0则删掉它并将序列翻转(操作A的逆向操作),一直重复这两个步骤直到字符串为空。如果中途无法操作,输出No,否则输出Yes。下面我们来证明这个方法的正确性:首先,假设有一个序列\(A......