LeetCode 12 Integer to Roman(整型数到罗马数)

翻译

给定一个整型数值,将其转换到罗马数字。

输入被保证在1到3999之间。

原文

Given an integer, convert it to a roman numeral.

Input is guaranteed to be within the range from 1 to 3999.

我不会告诉你一开始我是用的无数个变量和if……

后来实在受不了这么多变量就将其写成了枚举,那么接下来就迎刃而解了。

为了让大家理解罗马数是怎么计数的,这里我截了一张图,具体的大家可以自行用微软Bing搜索。

那么代码我就先贴出来了:

public class Solution
{
    public string IntToRoman(int num)
    {
        string result = "";
        Type R = typeof(Roman);

        foreach (var r in Enum.GetNames(R).Reverse())
        {
            while (num >= int.Parse(Enum.Format(R, Enum.Parse(R, r), "d")))
            {
                result += r.ToString();
                num -= int.Parse(Enum.Format(R, Enum.Parse(R, r), "d"));
            }
        }
        return result;
    }
}
public enum Roman
{
    M = 1000,
    CM = 900,
    D = 500,
    CD = 400,
    C = 100,
    XC = 90,
    L = 50,
    XL = 40,
    X = 10,
    IX = 9,
    V = 5,
    IV = 4,
    I = 1
};

今天晚些时候我会将 C# 枚举的一些用法贴到博客上,不了解的同学敬请关注。

除了枚举的用法外,我认为这道题中需要你去认真了解这些罗马数的规则,也就是说记得将9和4这种数也添加到枚举中哦。

那么在IntToRoman中都中都在做些什么呢?

  • 搭配Type和typeof新建出来R
  • 用foreach遍历枚举中的所有元素
  • 切记要加上Reverse(),至于为什么,大家试试不加就知道了
  • 如果num比枚举中的数字大,则将其对应的字符串(比如说”M”)添加到result中
  • 最后在num中减掉刚才已经用过的数字,数字也通过枚举来获取
  • 最后返回result

好了,到此为止,准备迎接下一题。

下一道题还是关于罗马数的,不过是从罗马数转换成整型数,欢迎大家访问:传送门:LeetCode 13 Roman to Integer(罗马数到整型数)

时间: 2024-09-10 21:55:28

LeetCode 12 Integer to Roman(整型数到罗马数)的相关文章

[LeetCode]12.Integer to Roman

[题目] Given an integer, convert it to a roman numeral. Input is guaranteed to be within the range from 1 to 3999. [分析] I = 1; V = 5; X = 10; L = 50; C = 100; D = 500; M = 1000; 还有一些特殊的:每两个阶段的之间有一个减法的表示,比如900=CM, C写在M前面表示M-C. 求商得到每个罗马文字的个数(如:3999  / 10

C语言删除无序整型数组中的重复元素及时间复杂度

遇到一个题,大概要求是写一个函数处理来去掉一个无序的整型数组(例如int i_arr[] = { 1, 2, 2, 3, 4, 2, 3, 5 };)中重复的元素,并返回最终的长度. 1 思路 看到这道题的时候,第一反应就是需要删除元素,然后联想到单链表.但是后面一想还是不划算,因为单链表还得先把数组中的元素遍历到链表节点中. 换一下思路,可以先创建另一个整型数组(大小和原数组一样),然后正向遍历数组中的元素,比较当前元素和它前面所有的元素是否重复,如果这个整数之前没有出现过,那么就放到新的数组

将字符串里的整型数据排序(二)

package cn.ic; import java.util.Arrays; //要求:将字符串"1,3,4,0,-3"里面的数值升序排列然后输出一个字符串 //步骤: //1 将字符串拆分为字符数组,利用split() //2 将字符串数组转换为整型数组,利用Integer.parseInt(String string); //3 将整型数组排序,利用Arrays.sort() //4 将整型数组转换为字符串,利用StringBuffer //其实不用函数intArrayToStr

在一个整型数组中有一个元素的出现次数超过了数组长度的一半,试设计一个 在时间上尽可能高效的算法,找出这个元素。

题目:在一个整型数组中有一个元素的出现次数超过了数组长度的一半,试设计一个 在时间上尽可能高效的算法,找出这个元素.要求:(1)给出算法的基本设计思想.(2)根据设计思想,采用C或C++或Java语言描述算法,关键之处给出注释.(3)说明你所设计算法的时间复杂度和空间复杂度. (1)基本的设计思想: 一个数字出现的次数超过了长度的一半, 那么我们可以这样认为这个数字出现的个数一定大于其他全部数字出现的个数之和.算法的步骤如下: ①设数组为data[],数组长度为n,i=1.置currentAxi

c语言-关于整型数组中数字使用printf输出的问题

问题描述 关于整型数组中数字使用printf输出的问题 #include int main(void) { int number[40]; scanf("%s", number); printf("%d", number[0]); return 0; } 数字以字符格式存在数组里,既然字符以数字的形式存储,那为何用%d输出是垃圾值呢?用%c却是正常的 解决方案 字符格式和整型是不同的,字符0对应着48,字符1对应着整数49.... 解决方案二: 字符'0',对应0x

Android 发送全4位的int整型数据到服务器

在App开发中常使用json与服务器Socket请求和解析服务器返回的数据. 为了确保在网络传输过程中没有丢失数据,一般会在发送请求数据前先发送把数据的长度发送到服务器.但数据的长度是需要发送全4位整型数据到服务器. 举个例子:使用手机号码和验证码登录 发送请求body为:{"cmd":"login","username":"ceshi","code":"123456"} 则数据的长度为

编程c语言-如何将整型数据比如1变为字符串001求大神指教

问题描述 如何将整型数据比如1变为字符串001求大神指教 在网上看到的方法是 int xx:string str=xx.tostring("000");可是在vs2013编译时 显示如图 是哪里有问题呢 解决方案 你所谓的网上找到得方法肯定不是c/c++语言吧,应该是c#或者java之类的,c/c++是没有int.tostring()这样的方法的,不过c++11中有所完善, c/c++最常用的就是格式化函数sprintf了,以下几行代码就是把 整形变量 i 以字符串"001&

怎么取得整型数组中连续相同的数字并输出打印,用java实现,也就是输出副本,只输出那些连续相同的数字

问题描述 怎么取得整型数组中连续相同的数字并输出打印,用java实现,也就是输出副本,只输出那些连续相同的数字 怎么取得整型数组中连续相同的数字并输出打印,用java实现,也就是输出副本,只输出那些连续相同的数字 解决方案 判断一下一个数字前后是否有相同的,有相同的话就输出,比如下面这样: int array [] = { 2,1,3,4,4,4,9,9,1,0,1,1,2 }; //只输出连续的数字 System.out.print("连续数字:"); for (int i=0;i&

c语言,对结构体中的整型数组进行赋值.....

问题描述 c语言,对结构体中的整型数组进行赋值..... c语言中,在结构体里声明整型数组,想对整型数组赋值,只能用循环吗?如果我想这样呢..... typedef struct Data { int arr[10]; }Data; int main() { Data data; data = (Data)malloc(sizeof(Data)); data->arr[10]={1,3,2,4,5,6,7,8,9,0}; . ... ... ... } 这样可以吗? 解决方案 绝对不可以.数组作