力扣大厂热门面试算法题 12-14

12. 整数转罗马数字,13. 罗马数字转整数,14. 最长公共前缀,每题做详细思路梳理,配套Python&Java双语代码, 2024.03.11 可通过leetcode所有测试用例。

目录

12. 整数转罗马数字

解题思路

完整代码

Java

Python

13. 罗马数字转整数

解题思路

完整代码

Java

Python

14. 最长公共前缀

解题思路

完整代码

Java

Python


12. 整数转罗马数字

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

字符          数值
I             1
V             5
X             10
L             50
C             100
D             500
M             1000
例如, 罗马数字 2 写做 II ,即为两个并列的 1。12 写做 XII ,即为 X + II 。 27 写做  XXVII, 即为 XX + V + II 。

通常情况下,罗马数字中小的数字在大的数字的右边。但也存在特例,例如 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:

输入: num = 3
输出: "III"
示例 2:

输入: num = 4
输出: "IV"
示例 3:

输入: num = 9
输出: "IX"
示例 4:

输入: num = 58
输出: "LVIII"
解释: L = 50, V = 5, III = 3.
示例 5:

输入: num = 1994
输出: "MCMXCIV"
解释: M = 1000, CM = 900, XC = 90, IV = 4.
 

提示:

1 <= num <= 3999

解题思路

要将整数转换为罗马数字,可以遵循以下思路:

  1. 理解罗马数字系统:首先,需要理解罗马数字是如何工作的。特别注意那些特殊的减法规则,比如4表示为IV,而不是IIII。

  2. 创建映射:创建一个映射(列表或字典),列出所有基本的罗马数字字符和它们对应的数值,包括那些特殊的组合,如IV、IX、XL等。

  3. 从高到低处理:从最大的数值(1000,对应M)开始,依次降至最小的数值(1,对应I),检查输入的整数可以包含多少个当前的罗马数字值。例如,如果输入是2000,那么可以包含两个'M'。

  4. 构建罗马数字:对于每个罗马数字值,将它们添加到结果字符串中,同时从整数中减去相应的数值,直到整数减到0。

  5. 返回结果:当整数减到0时,构建过程结束,返回结果字符串即为对应的罗马数字。

完整代码

Java
class Solution {public String intToRoman(int num) {// 定义罗马数字映射int[] values = {1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1};String[] symbols = {"M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I"};// 初始化结果字符串StringBuilder roman = new StringBuilder();// 遍历映射,构建罗马数字for (int i = 0; i < values.length; i++) {while (num >= values[i]) {num -= values[i];roman.append(symbols[i]);}}return roman.toString();}
}
Python
class Solution:def intToRoman(self, num: int) -> str:# 定义罗马数字映射roman_numerals = [(1000, "M"), (900, "CM"), (500, "D"), (400, "CD"),(100, "C"), (90, "XC"), (50, "L"), (40, "XL"),(10, "X"), (9, "IX"), (5, "V"), (4, "IV"), (1, "I")]# 初始化结果字符串roman = ""# 遍历映射,构建罗马数字for value, symbol in roman_numerals:while num >= value:num -= valueroman += symbolreturn roman

13. 罗马数字转整数

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

字符          数值
I             1
V             5
X             10
L             50
C             100
D             500
M             1000
例如, 罗马数字 2 写做 II ,即为两个并列的 1 。12 写做 XII ,即为 X + II 。 27 写做  XXVII, 即为 XX + V + II 。

通常情况下,罗马数字中小的数字在大的数字的右边。但也存在特例,例如 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:

输入: s = "III"
输出: 3
示例 2:

输入: s = "IV"
输出: 4
示例 3:

输入: s = "IX"
输出: 9
示例 4:

输入: s = "LVIII"
输出: 58
解释: L = 50, V= 5, III = 3.
示例 5:

输入: s = "MCMXCIV"
输出: 1994
解释: M = 1000, CM = 900, XC = 90, IV = 4.
 

提示:

1 <= s.length <= 15
s 仅含字符 ('I', 'V', 'X', 'L', 'C', 'D', 'M')
题目数据保证 s 是一个有效的罗马数字,且表示整数在范围 [1, 3999] 内
题目所给测试用例皆符合罗马数字书写规则,不会出现跨位等情况。
IL 和 IM 这样的例子并不符合题目要求,49 应该写作 XLIX,999 应该写作 CMXCIX 。
关于罗马数字的详尽书写规则,可以参考 罗马数字 - Mathematics 。

解题思路

  1. 建立映射表:首先,我们需要一个映射表来将罗马数字的字符映射到对应的整数值。这个映射表包括了7个基础字符(I、V、X、L、C、D、M)和6个特殊情况(IV、IX、XL、XC、CD、CM)。

  2. 遍历罗马数字字符串:然后,我们从左到右遍历输入的罗马数字字符串。

  3. 处理特殊情况:在遍历的过程中,如果发现当前字符和下一个字符组成的字符串存在于特殊情况的映射中(例如IV、IX),则将对应的整数值加到结果中,并跳过下一个字符。

  4. 处理一般情况:如果当前字符不属于特殊情况,直接将其对应的整数值加到结果中。

  5. 返回结果:遍历完成后,返回累加的结果,即为罗马数字字符串所表示的整数值。

完整代码

Java
public class Solution {public int romanToInt(String s) {// 建立罗马数字到整数的映射表Map<String, Integer> romanMap = new HashMap<>();romanMap.put("I", 1);romanMap.put("V", 5);romanMap.put("X", 10);romanMap.put("L", 50);romanMap.put("C", 100);romanMap.put("D", 500);romanMap.put("M", 1000);romanMap.put("IV", 4);romanMap.put("IX", 9);romanMap.put("XL", 40);romanMap.put("XC", 90);romanMap.put("CD", 400);romanMap.put("CM", 900);int result = 0;for (int i = 0; i < s.length();) {// 处理特殊情况if (i + 1 < s.length() && romanMap.containsKey(s.substring(i, i + 2))) {result += romanMap.get(s.substring(i, i + 2));i += 2;} else {// 处理一般情况result += romanMap.get(s.substring(i, i + 1));i++;}}return result;}
}
Python
class Solution:def romanToInt(self, s: str) -> int:# 建立罗马数字到整数的映射表roman_map = {'I': 1, 'V': 5, 'X': 10, 'L': 50, 'C': 100, 'D': 500, 'M': 1000,'IV': 4, 'IX': 9, 'XL': 40, 'XC': 90, 'CD': 400, 'CM': 900}# 初始化结果result = 0i = 0while i < len(s):# 处理特殊情况if i + 1 < len(s) and s[i:i+2] in roman_map:result += roman_map[s[i:i+2]]i += 2else:# 处理一般情况result += roman_map[s[i]]i += 1return result

14. 最长公共前缀

编写一个函数来查找字符串数组中的最长公共前缀。

如果不存在公共前缀,返回空字符串 ""。

示例 1:

输入:strs = ["flower","flow","flight"]
输出:"fl"
示例 2:

输入:strs = ["dog","racecar","car"]
输出:""
解释:输入不存在公共前缀。
 

提示:

1 <= strs.length <= 200
0 <= strs[i].length <= 200
strs[i] 仅由小写英文字母组成

解题思路

  1. 水平扫描法:逐个遍历字符串数组中的每个字符串,对于每个遍历到的字符串,更新最长公共前缀。开始时,令最长公共前缀为第一个字符串,然后依次将其与后续的字符串进行比较,逐一缩减最长公共前缀的长度,直到找到所有字符串的最长公共前缀。

  2. 垂直扫描法:从位置 0 开始,比较所有字符串的同一位置的字符是否相同。如果相同,继续对下一个位置进行比较,直到某个位置的字符不相同或某个字符串被完全遍历。这样,遍历过的位置就构成了最长公共前缀。

完整代码

Java
class Solution {public String longestCommonPrefix(String[] strs) {if (strs.length == 0) return "";String prefix = strs[0];for (int i = 1; i < strs.length; i++) {while (!strs[i].startsWith(prefix)) {prefix = prefix.substring(0, prefix.length() - 1);if (prefix.isEmpty()) return "";}}return prefix;}}
Python
class Solution:def longestCommonPrefix(self, strs: List[str]) -> str:if not strs:return ""# 最长公共前缀初始为第一个字符串prefix = strs[0]for s in strs[1:]:# 逐个字符比较,缩减前缀长度while s[:len(prefix)] != prefix and prefix:prefix = prefix[:len(prefix)-1]if not prefix:breakreturn prefix

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/738303.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

STM32 学习11 独立看门狗与窗口看门狗

STM32 学习11 独立看门狗与窗口看门狗 一、**看门狗概述**二、**STM32中的看门狗类型**1. 独立看门狗&#xff08;IWDG&#xff09;&#xff08;1&#xff09;基本概念&#xff08;2&#xff09;独立看门狗框图&#xff08;3&#xff09;独立看门狗配置步骤&#xff08;4&#…

十大排序算法(冒泡排序、插入排序、选择排序、希尔排序、堆排序、快排、归并排序、桶排序、计数排序、基数排序)

目录 一、冒泡排序&#xff1a; 二、插入排序&#xff1a; 三、选择排序&#xff1a; 四、希尔排序&#xff1a; 五、堆排序&#xff1a; 六、快速排序&#xff1a; 6.1挖坑法&#xff1a; 6.2左右指针法 6.3前后指针法&#xff1a; 七、归并排序&#xff1a; 八、桶…

Linux报错排查-CentOS/BigCloud_Enterprise_Linux系统yum安装kvm报错

Linux运维工具-ywtool 目录 一.系统环境二.问题描述三.问题解决四.其他命令 一.系统环境 系统版本:BigCloud_Enterprise_Linux 7.1 二.问题描述 通过yum安装kvm报错提示: /usr/bin/yum install -y qemu-kvm qemu-img libvirt libvirt-python virt-manager libvirt-client …

系统运维网络知识汇总

一、系统运维中网络方面的规划与思考 系统运维建立在网络的基础之上&#xff0c;如果没有一个相对合理的网络架构&#xff0c;恐怕系统运维做起来也不是那么的顺手。一个公司基本上都会把网络和服务器独立开来&#xff0c;划分不同的区域摆放设备&#xff0c;很多时候都是物理…

2024年家政预约上门服务小程序【用户端+商家端+师傅端】源码

024最新家政预约上门服务小程序源码 主要功能:商家入住&#xff0c;师傅入住&#xff0c;缴纳保正金 支持师傅&#xff0c;抢单派单 支持多城市多门下单&#xff0c;支持预约上门服务到店核销 支持补差价义价&#xff0c;支持区域服务限制 基于thinkphp和原生小程序开发

【五】【算法分析与设计】双指针的初见

167. 两数之和 II - 输入有序数组 给你一个下标从 1 开始的整数数组 numbers &#xff0c;该数组已按 非递减顺序排列 &#xff0c;请你从数组中找出满足相加之和等于目标数 target 的两个数。如果设这两个数分别是 numbers[index(1)] 和 numbers[index(2)] &#xff0c;则 1 &…

排序类算法

目录 一、交换类排序 1.冒泡排序 2.快速排序 二、 插入排序 1.直接插入排序 2.折半插入排序 3.希尔排序 三、选择排序 1.简单选择排序 2.堆排序 完整代码 四、归并排序 完整代码 五、汇总 六、OJ练习 1.冒泡排序&#xff1a;正确表示前一个数和后一个数 2.选…

LLM推理框架Triton Inference Server学习笔记(一): Triton Inference Server整体架构初识

官方文档查阅: TritonInferenceServer文档 1. 写在前面 这篇文章开始进行大语言模型(Large Language Model, LLM)的学习笔记整理&#xff0c;这次想从Triton Inference Server框架开始&#xff0c;因为最近工作上用到了一些大模型部署方面的知识&#xff0c; 所以就快速补充了…

【STM32】串口助手接受数据是乱码如何解决

第一步 首先判断自己使用的串口助手和工程配置的波特率是否相同&#xff0c;一般都是115200 第二步 如果不是上一条的问题&#xff0c;继续排查&#xff0c;检查时钟问题 打开工程&#xff0c;找到此文件(stm32f10x.h)的这个位置&#xff0c;如工程中未添加&#xff0c;可以从…

centos安装hadoop启动问题解决方案

1、出现了问题localhost: ERROR: JAVA_HOME is not set and could not be found. *解决方案尝试&#xff1a; 修改hadoop-env.sh&#xff08;在etc/hadoop&#xff09; sudo gedit /usr/local/hadoop/etc/hadoop/hadoop-env.sh 将原本的JAVA_HOME 替换为绝对路径就可以了 #expo…

Leetcode 144. 二叉树的前序遍历

题目描述&#xff1a;给定一个二叉树的根节点 root &#xff0c;返回 它的 前序 遍历 。 示例 1&#xff1a; 输入&#xff1a;root [1,null,2,3] 输出&#xff1a;[1,3,2] 示例 2&#xff1a; 输入&#xff1a;root [] 输出&#xff1a;[] 示例 3&#xff1a; 输入&…

关于C语言调用Python,PyImport_ImportModule函数的简介

函数原型&#xff1a;PyObject *PyImport_ImportModule(const char *name) 用于加载编译目标的文件 这个模块必须为.py文件&#xff0c;因为说直白点就是通过Python3 xxxx.py能够通过编译的东西

项目管理【引论二】项目管理的逻辑

系列文章目录 【引论一】项目管理的意义 【引论二】项目管理的逻辑 一、项目管理的目标 项目管理的目标是在规定的时间内&#xff0c;在批准的预算内&#xff0c;完成事先确定的工作范围内的工作&#xff0c;并且达到预期的质量性能要求。 1.1 时间、成本和质量之间的关系 1…

力扣226.翻转二叉树(二叉树的先序遍历)

文章目录 题目描述思路复杂度Code 题目描述 思路 利用二叉树的先序遍历&#xff0c;每次递归遍历时将当前节点的左右子节点交换即可 复杂度 时间复杂度: O ( n ) O(n) O(n)&#xff1b;其中 n n n为树节点的个数 空间复杂度: O ( h e i g h ) O(heigh) O(heigh)&#xff1b;其…

嵌入式学习第二十七天!(TCP并发模型)

TCP并发模型&#xff1a; 1. TCP多线程模型&#xff1a; 缺点&#xff1a;创建线程会带来资源开销&#xff0c;能够实现的并发量比较有限。 2. IO模型&#xff1a; 1. 阻塞IO&#xff1a; 没有数据到来时&#xff0c;可以让任务挂起&#xff0c;节省CPU资源开销&#xff0c;提…

案例分析篇01:软件架构设计考点架构风格及质量属性(2024年软考高级系统架构设计师冲刺知识点总结系列文章)

专栏系列文章推荐: 2024高级系统架构设计师备考资料(高频考点&真题&经验)https://blog.csdn.net/seeker1994/category_12601310.html 【历年案例分析真题考点汇总】与【专栏文章案例分析高频考点目录】(2024年软考高级系统架构设计师冲刺知识点总结-案例分析篇-…

【SpringCloud微服务实战01】Eureka 注册中心

前言 在 Eureka 架构中,微服务角色有两类: EurekaServer :服务端,注册中心 记录服务信息 心跳监控 EurekaClient :客户端 Provider :服务提供者,例如案例中的 user-service 注册自己的信息到 EurekaS…

解决vue项目,运行npm install安装报缺少c++库问题

项目是前后端分离架构&#xff0c;前端使用的是vue框架&#xff0c;在部署前端项目时&#xff0c;需要下载安装一些基础的镜像配置&#xff0c;包括一些预处理&#xff0c;但是在使用npm install和yarn install命令时出现了如下错误&#xff0c;查阅资料总结如下&#xff1a; …

WPF(2)命令绑定

效果是&#xff1a;当TextBox控件的Text属性为空时show按钮不可用&#xff0c;有值时show按钮可用 项目结构 界面代码 <Window x:Class"WpfApp1.MainWindow"xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x"http://sc…

Flutter ios一键三连脚本

flutter运行ios时总得执行三个命令,中间还得等待&#xff0c;有没有脚本自动执行 ## ios 执行命令 - flutter clean - flutter pub get - cd ios - pod install有&#xff0c;项目根目录创建shell 文件夹&#xff0c;新建setup.sh setup.sh里面放如下代码 #!/bin/bash# ios …