首页 > 试题广场 >

牛牛的罗马时代节日

[编程题]牛牛的罗马时代节日
  • 热度指数:149 时间限制:C/C++ 5秒,其他语言10秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
在草原上,一群牛过着平静的生活。它们有个习俗,就是在罗马时代节日的时候,会自发地站成一排,每头牛背上都有一个罗马数字。他们按照顺序一个挨着一个,并通过每头牛背后的罗马数字来点出罗马数字的和。
字符 数值
I 1
V 5
X 10
L 50
C 100
D 500
M 1000
通常字符可以拼接,相同的字符并列就是几倍,同时小的数字在大的数字的右边表示相加,大的数字在小的数字右边表示大数减小数。例如 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。

现给你一个每头牛排列的数组cowsRomanNumeral,请编写一个函数,计算每头牛的罗马数字之和。
示例1

输入

["I","II","IV"]

输出

7
示例2

输入

["XXX","L","V"]

输出

85

备注:

1 <= cowsRomanNumeral.size() <= 100
1 <= cowsRomanNumeral[i].length <= 15
cowsRomanNumeral[i] 仅包含字符('I','V','X','L','C','D','M')
题目数据保证 cowsRomanNumeral 是一个有效的罗马数字数组,且表示整数在范围 [1,3999] 内

哈希表+数学
#include <unordered_map>
class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param cowsRomanNumeral string字符串vector 
     * @return int整型
     */
    int sumOfRomanNumerals(vector<string>& cowsRomanNumeral) {
        // write code here
        // 哈希表+数学
        unordered_map<char, int> um;
        um['I'] = 1;
        um['V'] = 5;
        um['X'] = 10;
        um['L'] = 50;
        um['C'] = 100;
        um['D'] = 500;
        um['M'] = 1000;

        int ans = 0;
        for(auto str:cowsRomanNumeral)
        {
            // 从右到左遍历字符串
            int t = 0;
            for(int i=str.size()-1; i>=0; --i)
            {
                if(i==str.size()-1)
                    t += um[str[i]];
                else
                {
                    // 右边的大
                    if(um[str[i]]<um[str[i+1]])
                        t -= um[str[i]];
                    // 右边的小或左右相等
                    else
                        t += um[str[i]];
                }
            }

            ans += t;
        }

        return ans;
    }
};

发表于 2024-05-21 21:44:38 回复(0)