leetcode2: 罗马数字转整数(13)、最长公共前缀(14)

1. 罗马数字转整数

罗马数字包含以下七种字符: I, V, X, L,C,D 和 M。

字符          数值
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。
给定一个罗马数字,将其转换成整数。输入确保在 1 到 3999 的范围内。

思路:1. 利用哈希表存放罗马数字和对应整数。2. 考虑特殊情况6种:小的数字在大的数字的左边。XIX可以想成是10-1+10,所以我们判定出有特殊情况以后,利用一个变量单独存储特殊情况位的负值。其他位的值正常加。最后在统一加上所有负值的和。

class Solution {
public:
    int romanToInt(string s) {
        unordered_map<char,int> m;              //定义哈希表
        m['I'] = 1;
        m['V'] = 5;
        m['X'] = 10;
        m['L'] = 50;
        m['C'] = 100;
        m['D'] = 500;
        m['M'] = 1000;
        
        int pos = 0, neg = 0;
        for(int i=0; i<s.size()-1;i++)
        {
            if (m[s[i]] < m[s[i+1]])
            {
                neg -= m[s[i]];
            }
            else
            {
                pos += m[s[i]];
            }
        }
        pos += m[s.back()];                     //注意最后一位的值也要处理
        return pos + neg;
    }
};

参考链接:https://leetcode-cn.com/problems/roman-to-integer/solution/si-lu-qing-xi-shi-xian-jian-dan-de-fang-fa-by-june/

https://leetcode-cn.com/problems/roman-to-integer/

2. 最长公共前缀

编写一个函数来查找字符串数组中的最长公共前缀。如果不存在公共前缀,返回空字符串 ""

思路:1.for循环找出最短字符串。2.从第一个字符开始比较(比较对象是最短字符串),不一样则返回公共前缀,一样则添加。

class Solution {
public:
    string longestCommonPrefix(vector<string>& strs) {
        string  ans = "";
        if (strs.size() == 0)
            return ans;
        if (strs.size() == 1)
            return strs[0];
        string min = strs[0];
        for (int i=1; i<strs.size();i++)
        {
            if (strs[i].size()<min.size())
                min = strs[i];
        }
        for (int j=0;j<min.size();j++)
        {
            for (int m=0; m<strs.size();m++)
            {
                if(strs[m][j]!=min[j])
                    return ans;
            }
            ans = ans + min[j];
        }
      return ans;
    }
};

参考链接:https://leetcode-cn.com/problems/longest-common-prefix/solution/cxiang-xi-ti-jie-by-youlookdeliciousc-5/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值