Leetcode 每日刷题--罗马数字转整数

问题描述:给定罗马数字(字符表示)转整数

结题思路:

  1. 字符串遍历,转为对应整数,由于一一对应,使用haspmap 建立hasp 表

  1. 对于4,9这类特殊数字,做特殊处理,根据下图规则可以看出,

表示4,9时,前一个罗马字符小于后一个,据其处理即可,

答案C语言版本:

#include "errno.h"
#include "string.h"

#define ARRAY_SIZE(x) sizeof(x) / sizeof(x[0])

struct hash_map {
    char key;
    uint32_t value;
};

static struct hash_map roman_to_inter_convetor[] = {
    {
        .key = 'I',
        .value = 1,
    },
    {
        .key = 'V',
        .value = 5,
    },
    {
        .key = 'X',
        .value = 10,
    },
    {
        .key = 'L',
        .value =  50,
    },
    {
        .key = 'C',
        .value = 100,
    },
    {
        .key = 'D',
        .value = 500,
    },
    {
        .key = 'M',
        .value =1000,
    },
};

static struct hash_map* get_hash_map_by_key(char key) {
    uint32_t i = 0;

    for (i = 0; i < ARRAY_SIZE(roman_to_inter_convetor); i++)
        if (roman_to_inter_convetor[i].key == key)
            return &roman_to_inter_convetor[i];

    return NULL;
}

int romanToInt(char * s) {
    uint32_t i = 0;
    struct hash_map *mapped = NULL;
    uint32_t mapped_value[15] = {0};
    uint32_t result = 0;

    for (i = 0; i < strlen(s); i++) {
        mapped = get_hash_map_by_key(s[i]);
        if (!mapped)
            return -EINVAL;

        mapped_value[i] = mapped->value;
    }

    for (i = 0; i < strlen(s) -1; i++) {
        if (mapped_value[i] < mapped_value[i + 1])
            result -= mapped_value[i];
        else
            result += mapped_value[i];
    }

    result += mapped_value[i];
    return result;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值