Java每日一练(20230420) 罗马数字转整数、电话号码的字母组合、排列序列

简介: Java每日一练(20230420) 罗马数字转整数、电话号码的字母组合、排列序列

1. 罗马数字转整数

罗马数字包含以下七种字符: IVXLCDM

字符          数值

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 = "III"

输出: 3

示例 2:

输入: num = "IV"

输出: 4

示例 3:

输入: num = "IX"

输出: 9

示例 4:

输入: num = "LVIII"

输出: 58

解释: L = 50, V = 5, III = 3.


示例 5:

输入: num = "MCMXCIV"

输出: 1994

解释: M = 1000, CM = 900, XC = 90, IV = 4.


提示:

  • 1 <= num <= 3999

出处:

https://edu.csdn.net/practice/26046518

代码:

import java.util.*;
public class romanToInt {
    public static class Solution {
        public int romanToInt(String s) {
            int n = 0;
            for (int i = 0; i < s.length();) {
                char c = s.charAt(i);
                if (c == 'I') {
                    if (i + 1 < s.length()) {
                        if (s.charAt(i + 1) == 'V') {
                            n += 4;
                            i += 2;
                        } else if (s.charAt(i + 1) == 'X') {
                            n += 9;
                            i += 2;
                        } else {
                            n += 1;
                            i++;
                        }
                    } else {
                        n += 1;
                        i++;
                    }
                } else if (c == 'X') {
                    if (i + 1 < s.length()) {
                        if (s.charAt(i + 1) == 'L') {
                            n += 40;
                            i += 2;
                        } else if (s.charAt(i + 1) == 'C') {
                            n += 90;
                            i += 2;
                        } else {
                            n += 10;
                            i++;
                        }
                    } else {
                        n += 10;
                        i++;
                    }
                } else if (c == 'C') {
                    if (i + 1 < s.length()) {
                        if (s.charAt(i + 1) == 'D') {
                            n += 400;
                            i += 2;
                        } else if (s.charAt(i + 1) == 'M') {
                            n += 900;
                            i += 2;
                        } else {
                            n += 100;
                            i++;
                        }
                    } else {
                        n += 100;
                        i++;
                    }
                } else if (c == 'V') {
                    n += 5;
                    i++;
                } else if (c == 'L') {
                    n += 50;
                    i++;
                } else if (c == 'D') {
                    n += 500;
                    i++;
                } else if (c == 'M') {
                    n += 1000;
                    i++;
                }
            }
            return n;
        }
    }
    public static void main(String[] args) {
        Solution s = new Solution();
        String str = "III";
        System.out.println(s.romanToInt(str));
        str = "IV";
        System.out.println(s.romanToInt(str));
        str = "IX";
        System.out.println(s.romanToInt(str));
        str = "LVIII";
        System.out.println(s.romanToInt(str));
        str = "MCMXCIV";
        System.out.println(s.romanToInt(str));
    }
}

输出:

3

4

9

58

1994


2. 电话号码的字母组合

给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。

给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。

示例 1:

输入:digits = "23"

输出:["ad","ae","af","bd","be","bf","cd","ce","cf"]

示例 2:

输入:digits = ""

输出:[]

示例 3:

输入:digits = "2"

输出:["a","b","c"]


提示:

  • 0 <= digits.length <= 4
  • digits[i] 是范围 ['2', '9'] 的一个数字。

出处:

https://edu.csdn.net/practice/26046519

代码:

import java.util.*;
public class romanToInt {
    public static class Solution {
        public List<String> letterCombinations(String digits) {
            Character[][] letters = { {}, {}, { 'a', 'b', 'c' }, { 'd', 'e', 'f' }, { 'g', 'h', 'i' }, { 'j', 'k', 'l' },
                    { 'm', 'n', 'o' }, { 'p', 'q', 'r', 's' }, { 't', 'u', 'v' }, { 'w', 'x', 'y', 'z' }, };
            List<List<Character>> combinations = new ArrayList<>();
            for (int i = 0; i < digits.length(); i++) {
                Character d = digits.charAt(i);
                int index = Character.getNumericValue(d);
                Character[] letter = letters[index];
                //System.out.println(d);
                if (i == 0) {
                    for (int j = 0; j < letter.length; j++) {
                        List<Character> c = new ArrayList<>();
                        c.add(letter[j]);
                        combinations.add(c);
                    }
                } else {
                    List<List<Character>> added = new ArrayList<>();
                    for (int j = 0; j < combinations.size(); j++) {
                        List<Character> c = combinations.get(j);
                        List<Character> origin_c = new ArrayList<>(c);
                        for (int k = 0; k < letter.length; k++) {
                            Character l = letter[k];
                            if (k == 0) {
                                c.add(l);
                            } else {
                                List<Character> new_c = new ArrayList<>(origin_c);
                                new_c.add(l);
                                added.add(new_c);
                            }
                        }
                    }
                    combinations.addAll(added);
                }
            }
            List<String> output = new ArrayList<>();
            for (int i = 0; i < combinations.size(); i++) {
                List<Character> c = combinations.get(i);
                StringBuilder sb = new StringBuilder();
                for (Character l : c) {
                    sb.append(l);
                }
                output.add(sb.toString());
            }
            return output;
        }
    }
    public static void main(String[] args) {
        Solution s = new Solution();
        String str = "23";
        System.out.println(s.letterCombinations(str));
        str = "";
        System.out.println(s.letterCombinations(str));
        str = "2";
        System.out.println(s.letterCombinations(str));
    }
}

输出:

[ad, bd, cd, ae, af, be, bf, ce, cf]

[]

[a, b, c]


3. 排列序列

给出集合 [1,2,3,...,n],其所有元素共有 n! 种排列。

按大小顺序列出所有排列情况,并一一标记,当 n = 3 时, 所有排列如下:

  1. "123"
  2. "132"
  3. "213"
  4. "231"
  5. "312"
  6. "321"

给定 nk,返回第 k 个排列。

示例 1:

输入:n = 3, k = 3

输出:"213"

示例 2:

输入:n = 4, k = 9

输出:"2314"

示例 3:

输入:n = 3, k = 1

输出:"123"


提示:

  • 1 <= n <= 9
  • 1 <= k <= n!

以下程序实现了这一功能,请你填补空白处内容:

```Java
class Solution {
    public String getPermutation(int n, int k) {
        StringBuilder sb = new StringBuilder();
        List candidates = new ArrayList<>();
        int[] factorials = new int[n + 1];
        factorials[0] = 1;
        int fact = 1;
        for (int i = 1; i <= n; ++i) {
            candidates.add(i);
            fact *= i;
            factorials[i] = fact;
        }
        k -= 1;
        ____________________;
        return sb.toString();
    }
}
```

出处:

https://edu.csdn.net/practice/26046520

代码:

import java.util.*;
public class getPermutation {
    public static class Solution {
        public String getPermutation(int n, int k) {
            StringBuilder sb = new StringBuilder();
            List<Integer> candidates = new ArrayList<>();
            int[] factorials = new int[n + 1];
            factorials[0] = 1;
            int fact = 1;
            for (int i = 1; i <= n; ++i) {
                candidates.add(i);
                fact *= i;
                factorials[i] = fact;
            }
            k -= 1;
    for (int i = n - 1; i >= 0; --i) {
        int index = k / factorials[i];
        sb.append(candidates.remove(index));
        k -= index * factorials[i];
    }
            return sb.toString();
        }
    }
    public static void main(String[] args) {
        Solution s = new Solution();
        System.out.println(s.getPermutation(3,3));
        System.out.println(s.getPermutation(4,9));
        System.out.println(s.getPermutation(3,1));
    }
}

输出:

213

2314

123


🌟 每日一练刷题专栏 🌟

持续,努力奋斗做强刷题搬运工!

👍 点赞,你的认可是我坚持的动力!

🌟 收藏,你的青睐是我努力的方向!

评论,你的意见是我进步的财富!  

主页:https://hannyang.blog.csdn.net/


目录
相关文章
|
6月前
|
Java
CSDN每日一练(Java)--小艺的英文名
CSDN每日一练(Java)--小艺的英文名
|
5月前
|
Java API Apache
探讨Java中检测字符串是否包含数字和字母的技术
探讨Java中检测字符串是否包含数字和字母的技术
72 2
|
5月前
|
Java
使用java计算一个字符串中字母出现的次数
使用java计算一个字符串中字母出现的次数
|
6月前
|
安全 Java C++
2023-3-25 java选择题每日一练
2023-3-25 java选择题每日一练
43 1
|
5月前
|
存储 算法 Java
【经典算法】LeetCode 1170:比较字符串最小字母出现频次(Java/C/Python3实现含注释说明,中等)
【经典算法】LeetCode 1170:比较字符串最小字母出现频次(Java/C/Python3实现含注释说明,中等)
30 0
|
6月前
|
Java
java判断字符串中有多少数字字母或者符号
java判断字符串中有多少数字字母或者符号
|
11天前
|
监控 安全 Java
在 Java 中使用线程池监控以及动态调整线程池时需要注意什么?
【10月更文挑战第22天】在进行线程池的监控和动态调整时,要综合考虑多方面的因素,谨慎操作,以确保线程池能够高效、稳定地运行,满足业务的需求。
88 38
|
8天前
|
安全 Java
java 中 i++ 到底是否线程安全?
本文通过实例探讨了 `i++` 在多线程环境下的线程安全性问题。首先,使用 100 个线程分别执行 10000 次 `i++` 操作,发现最终结果小于预期的 1000000,证明 `i++` 是线程不安全的。接着,介绍了两种解决方法:使用 `synchronized` 关键字加锁和使用 `AtomicInteger` 类。其中,`AtomicInteger` 通过 `CAS` 操作实现了高效的线程安全。最后,通过分析字节码和源码,解释了 `i++` 为何线程不安全以及 `AtomicInteger` 如何保证线程安全。
java 中 i++ 到底是否线程安全?
|
2天前
|
存储 设计模式 分布式计算
Java中的多线程编程:并发与并行的深度解析####
在当今软件开发领域,多线程编程已成为提升应用性能、响应速度及资源利用率的关键手段之一。本文将深入探讨Java平台上的多线程机制,从基础概念到高级应用,全面解析并发与并行编程的核心理念、实现方式及其在实际项目中的应用策略。不同于常规摘要的简洁概述,本文旨在通过详尽的技术剖析,为读者构建一个系统化的多线程知识框架,辅以生动实例,让抽象概念具体化,复杂问题简单化。 ####
|
3天前
|
Java 开发者
在Java多线程编程的世界里,Lock接口正逐渐成为高手们的首选,取代了传统的synchronized关键字
在Java多线程编程的世界里,Lock接口正逐渐成为高手们的首选,取代了传统的synchronized关键字
19 4