LeetCode 编程 二

简介: 整数转罗马数字罗马数字包含以下七种字符: I, V, X, L,C,D 和 M。字符 数值I 1V 5X 10L 50C 100D 500M 1000例如, 罗马数字 2 写做 II ,即为两个并列的 1。

整数转罗马数字

罗马数字包含以下七种字符: 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 到 3999 的范围内。

示例 1:

输入: 3
输出: "III"

示例 2:

输入: 4
输出: "IV"

示例 3:

输入: 9
输出: "IX"

示例 4:

输入: 58
输出: "LVIII"
解释: C = 100, L = 50, XXX = 30, III = 3.

示例 5:

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

解法:在求解的时候把所有的可能性全部定义出来,不要再中间进行判断。

public class Solution {
    public String intToRoman(int num) {
        if(num <= 0) {
            return "";
        }
        int[] nums = {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 res = new StringBuilder();
        int digit = 0;
        while (num > 0) {
            int times = num / nums[digit];
            num -= nums[digit] * times;
            for ( ; times > 0; times --) {
                res.append(symbols[digit]);
            }
            digit++;
        }
        return res.toString();
    }
}

这里特殊的情况上面也已经提到,一个是 900,一个是 400,一个是 90,还有一个是 40,还有一个是 9,一个是 4。全部显式的定义在数组中即可。

罗马数字转整数

罗马数字包含以下七种字符: 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 到 3999 的范围内。

示例 1:

输入: "III"
输出: 3

示例 2:

输入: "IV"
输出: 4

示例 3:

输入: "IX"
输出: 9

示例 4:

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

示例 5:

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

九章算术解答

public class Solution {
     public int romanToInt(String s) {
        if (s == null || s.length()==0) {
                return 0;
        }
        Map<Character, Integer> m = new HashMap<Character, Integer>();
        m.put('I', 1);
        m.put('V', 5);
        m.put('X', 10);
        m.put('L', 50);
        m.put('C', 100);
        m.put('D', 500);
        m.put('M', 1000);

        int length = s.length();
        int result = m.get(s.charAt(length - 1));
        for (int i = length - 2; i >= 0; i--) {
            if (m.get(s.charAt(i + 1)) <= m.get(s.charAt(i))) {
                result += m.get(s.charAt(i));
            } else {
                result -= m.get(s.charAt(i));
            }
        }
        return result;
    }
}

问:Keep 编程题,Keep 有很多课程,每门课程有一个开始时间和一个结束时间。写一个函数判断一个人是否可以参加所有的课程。输出为 true or false

#include <iostream>
#include <cstdio>
using namespace std;

int main()
{
    int s, e;
    int temp = -1;
    while(scanf("%d,%d", &s, &e) != EOF)
    {
        if(s < temp)
        {
            printf("false\n");
            return 0;
        }
        temp = e;
    }
    printf("true\n");
    return 0;
}

问:输入一个字符串 s ,字符串 s 包含 1 - 50 个字符,字符串 s 中每个字符是 ‘ a’ 和 ‘b’,如果有多个最优解,可以返回任何一个

思路:

  1. 遍历判断字符串是否是回文串
  2. 情况一,如果是,不管是‘a’ 还是’b’,全部当成一组输出,即全是1
  3. 情况二,如果不是,遇到‘a’ 输出1,遇到’b’,输出2
#include <iostream>
#include <cstdio>
#include <string>
using namespace std;

int main()
{
    string s;
    cin >> s;
    bool flag = true;
    for(int i=0,j=s.size()-1; i<j; ++i,--j)//判断是否是回文串
    {
        if(s[i] != s[j])
        {
            flag = false;
            break;
        }
    }
    if(flag)//是回文串,情况一
    {
        for(int i=0; i<s.size()-1; ++i)
        {
            printf("1,");
        }
        printf("1\n");
    }
    else//不是回文串,情况二
    {
        for(int i=0; i<s.size()-1; ++i)
        {
            if(s[i] == 'a')
                printf("1,");
            else
                printf("2,");
        }
        if(s[s.size()-1] == 'a')
            printf("1\n");
        else
            printf("2\n");
    }
    return 0;
}

img_d8ab749f320c73d73b299e1e4ed2513e.png
09.png

注意遇到 a 输出 1,遇到 b 输出 2 。

目录
相关文章
|
11月前
|
算法 程序员
【LeetCode——编程能力入门第一天】基本数据类型[在区间范围内统计奇数数目/去掉最低工资和最高工资后的工资平均值)
给你两个非负整数 low 和 high 。请你返回 low 和 high 之间(包括二者)奇数的数目。 示例 1: 输入:low = 3, high = 7 输出:3 解释:3 到 7 之间奇数数字为 [3,5,7] 。 示例 2: 输入:low = 8, high = 10 输出:1 解释:8 到 10 之间奇数数字为 [9] 。 提示: 0 <= low <= high <= 10^9。
78 0
|
11月前
|
算法
回溯算法编程题集合(leetcode)
回溯算法编程题集合(leetcode)
|
11月前
|
算法
动态规划编程题集合(leetcode)
动态规划编程题集合(leetcode)
|
11月前
链表编程题集合(leetcode)
链表编程题集合(leetcode)
|
11月前
动态规划编程题集合(leetcode)
动态规划编程题集合(leetcode)
|
11月前
|
存储
单调栈编程题集合(leetcode)
单调栈编程题集合(leetcode)
|
11月前
栈和队列编程题集合(leetcode)
栈和队列编程题集合(leetcode)
|
11月前
二叉树编程题集合(leetcode)
二叉树编程题集合(leetcode)
|
11月前
|
机器学习/深度学习
背包问题动态规划编程题集合(leetcode)
背包问题动态规划编程题集合(leetcode)
|
11月前
|
算法 索引
滑动窗口编程题集合(leetcode)
滑动窗口编程题集合(leetcode)