13. 罗马数字转整数

63 阅读1分钟

知识点哈希表

使用情境:如何在一个无序的线性表中查找一个数据元素? 一般情况下我们就用某一种映射算法把这些数据元素存到map中,然后再根据映射算法快速把元素找出来 主要有三种映射算法

(1)除留取余法

取关键字被某个不大于哈希表长m的数p除后所得余数为哈希地址。即:f(key)=key % p, p≤m;

(2)直接定址法

直接定址法是指取关键字或关键字的某个线性函数值为哈希地址。即: f(key)=key 或者 f(key)=a*key+b、

(3)数字分析法

假设关键字是以为基的数(如以10为基的十进制数),并且哈希表中可能出现的关键字都是事先知道的,则可以选取关键字的若干位数组成哈希表。

代码分析

这道题主要就用数字分析法, 首先创建了一个哈希表和题目中说好的罗马数字一一对应了

const map = {
        I : 1,
        IV: 4,
        V: 5,
        IX: 9,
        X: 10,
        XL: 40,
        L: 50,
        XC: 90,
        C: 100,
        CD: 400,
        D: 500,
        CM: 900,
        M: 1000
    };

然后先判断两两字母能不能对应,对应了就相加,不能对应再去对应一个字母的

let ans = 0;
//在这里不加i的值因为不能确定加1还是加2
 for(i=0; i< s.length;){
    if(i+1 < s.length && map[s.substring(i,i+2)]){
    //map用[] substring是截取数组的切片
        ans += map[s.substring(i, i+2)];
        i += 2;
    }
    else{
        ans += map[s.substring(i,i+1)];
        i++;
    }
 }
 return ans