0
点赞
收藏
分享

微信扫一扫

基于redis实现用户登陆

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

目录

12. 整数转罗马数字

解题思路

完整代码

Java

Python

13. 罗马数字转整数

解题思路

完整代码

Java

Python

14. 最长公共前缀

解题思路

完整代码

Java

Python


12. 整数转罗马数字

解题思路

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

  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 -= value
                roman += symbol
        return roman

13. 罗马数字转整数

解题思路

  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 = 0
        i = 0
        
        while i < len(s):
            # 处理特殊情况
            if i + 1 < len(s) and s[i:i+2] in roman_map:
                result += roman_map[s[i:i+2]]
                i += 2
            else:
                # 处理一般情况
                result += roman_map[s[i]]
                i += 1
        
        return result

14. 最长公共前缀

解题思路

  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:
                break
                
        return prefix

举报

相关推荐

0 条评论