力扣--哈希表13.罗马数字转整数

2024-05-26 03:44

本文主要是介绍力扣--哈希表13.罗马数字转整数,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

首先我们可以知道,一个整数,最多由2个罗马数字组成。

思路分析

这个方法能够正确将罗马数字转换为阿拉伯数字的原因在于它遵循了罗马数字的规则,并且对这些规则进行了正确的编码和处理。

罗马数字规则
  1. 罗马数字由以下字符组成:I, V, X, L, C, D, M,分别对应的阿拉伯数字为:1, 5, 10, 50, 100, 500, 1000。
  2. 一般情况下,罗马数字表示法从左到右是从大到小累加。例如:VI = 5 + 1 = 6。
  3. 但是,有些情况下需要用减法来表示,例如:IV = 5 - 1 = 4。这种情况出现在一个较小的数字出现在较大的数字之前。
算法步骤
  1. 初始化哈希表

    • 使用一个哈希表(map)将罗马数字字符映射到对应的阿拉伯数字值。这样我们可以在O(1)时间复杂度内查找每个字符对应的值。
  2. 遍历字符串

    • 从左到右遍历罗马数字字符串。
  3. 处理特殊规则

    • 如果当前字符的值小于下一个字符的值,那么根据罗马数字的规则,当前字符应被减去。例如,IV中的I(1)小于V(5),因此应计算5 - 1。
    • 如果当前字符的值大于或等于下一个字符的值,那么直接将其值累加。例如,VI中的V(5)大于I(1),因此应计算5 + 1。
为什么可以得出正确结果
  1. 哈希表的使用

    • 哈希表允许我们快速找到每个罗马字符对应的阿拉伯数字值,确保了查找操作的高效性和准确性。
  2. 遍历与比较

    • 通过遍历字符串,并比较当前字符与下一个字符的值,我们可以准确地识别应该进行加法还是减法。这种方法符合罗马数字的规则,从而确保了正确的转换。
  3. 累加与减法处理

    • 如果遇到需要进行减法的情况(即当前字符值小于下一个字符值),我们在累加当前字符值时进行了正确的调整,即减去当前字符值两次(先加再减),从而正确处理了减法情况。
class Solution {// 哈希表,用于存储罗马数字字符到阿拉伯数字的映射map<char, int> hash;// 函数:初始化哈希表,将罗马数字映射为阿拉伯数字void getHash() {hash['I'] = 1;hash['V'] = 5;hash['X'] = 10;hash['L'] = 50;hash['C'] = 100;hash['D'] = 500;hash['M'] = 1000;}public:int romanToInt(string s) {getHash();  // 初始化哈希表int num = 0;  // 最终结果int after;    // 下一个字符对应的值// 遍历字符串的每个字符for (int i = 0; i < s.size(); i++) {if (i == s.size() - 1) {// 如果是最后一个字符,直接加上对应的值num += hash[s[i]];} else {// 获取下一个字符的值after = hash[s[i + 1]];// 如果当前字符的值小于下一个字符的值if (hash[s[i]] < after) {// 根据罗马数字的规则,组合成减法表达式num += after - hash[s[i]];// 跳过下一个字符i++;} else {// 当前字符的值大于或等于下一个字符的值,直接加上num += hash[s[i]];}}}return num; // 返回结果}
};

这篇关于力扣--哈希表13.罗马数字转整数的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1003434

相关文章

哈希leetcode-1

目录 1前言 2.例题  2.1两数之和 2.2判断是否互为字符重排 2.3存在重复元素1 2.4存在重复元素2 2.5字母异位词分组 1前言 哈希表主要是适合于快速查找某个元素(O(1)) 当我们要频繁的查找某个元素,第一哈希表O(1),第二,二分O(log n) 一般可以分为语言自带的容器哈希和用数组模拟的简易哈希。 最简单的比如数组模拟字符存储,只要开26个c

Java进阶13讲__第12讲_1/2

多线程、线程池 1.  线程概念 1.1  什么是线程 1.2  线程的好处 2.   创建线程的三种方式 注意事项 2.1  继承Thread类 2.1.1 认识  2.1.2  编码实现  package cn.hdc.oop10.Thread;import org.slf4j.Logger;import org.slf4j.LoggerFactory

usaco 1.3 Prime Cryptarithm(简单哈希表暴搜剪枝)

思路: 1. 用一个 hash[ ] 数组存放输入的数字,令 hash[ tmp ]=1 。 2. 一个自定义函数 check( ) ,检查各位是否为输入的数字。 3. 暴搜。第一行数从 100到999,第二行数从 10到99。 4. 剪枝。 代码: /*ID: who jayLANG: C++TASK: crypt1*/#include<stdio.h>bool h

PTA求一批整数中出现最多的个位数字

作者 徐镜春 单位 浙江大学 给定一批整数,分析每个整数的每一位数字,求出现次数最多的个位数字。例如给定3个整数1234、2345、3456,其中出现最多次数的数字是3和4,均出现了3次。 输入格式: 输入在第1行中给出正整数N(≤1000),在第二行中给出N个不超过整型范围的非负整数,数字间以空格分隔。 输出格式: 在一行中按格式“M: n1 n2 ...”输出,其中M是最大次数,n

整数Hash散列总结

方法:    step1  :线性探测  step2 散列   当 h(k)位置已经存储有元素的时候,依次探查(h(k)+i) mod S, i=1,2,3…,直到找到空的存储单元为止。其中,S为 数组长度。 HDU 1496   a*x1^2+b*x2^2+c*x3^2+d*x4^2=0 。 x在 [-100,100] 解的个数  const int MaxN = 3000

哈希表的底层实现(1)---C++版

目录 哈希表的基本原理 哈希表的优点 哈希表的缺点 应用场景 闭散列法 开散列法 开放定值法Open Addressing——线性探测的模拟实现 超大重点部分评析 链地址法Separate Chaining——哈希桶的模拟实现 哈希表(Hash Table)是一种数据结构,它通过将键(Key)映射到值(Value)的方式来实现快速的数据存储与查找。哈希表的核心概念是哈希

两数之和--力扣1

两数之和 题目思路C++代码 题目 思路 根据题目要求,元素不能重复且不需要排序,我们这里使用哈希表unordered_map。注意题目说了只对应一种答案。 所以我们在循环中,使用目标值减去当前循环的nums[i],得到差值,如果我们在map中能够找到这个差值,就说明存在两个整数的和为目标值。 如果没有找到,就将当前循环的nums[i]以及下标i放入map中,以便后续查

哈希表的封装和位图

文章目录 2 封装2.1 基础框架2.2 迭代器(1)2.3 迭代器(2) 3. 位图3.1 问题引入3.2 左移和右移?3.3 位图的实现3.4 位图的题目3.5 位图的应用 2 封装 2.1 基础框架 文章 有了前面map和set封装的经验,容易写出下面的代码 // UnorderedSet.h#pragma once#include "HashTable.h"

【408数据结构】散列 (哈希)知识点集合复习考点题目

苏泽  “弃工从研”的路上很孤独,于是我记下了些许笔记相伴,希望能够帮助到大家    知识点 1. 散列查找 散列查找是一种高效的查找方法,它通过散列函数将关键字映射到数组的一个位置,从而实现快速查找。这种方法的时间复杂度平均为(

PHP: 深入了解一致性哈希

前言 随着memcache、redis以及其它一些内存K/V数据库的流行,一致性哈希也越来越被开发者所了解。因为这些内存K/V数据库大多不提供分布式支持(本文以redis为例),所以如果要提供多台redis server来提供服务的话,就需要解决如何将数据分散到redis server,并且在增减redis server时如何最大化的不令数据重新分布,这将是本文讨论的范畴。 取模算法 取模运