Bootstrap

leetcode day2 13+12

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

方法一

普通字符直接加

其他字符:判断下一位,判断是否构成减法的情况

是,做减法 

不是,做加法



int romanToInt(char * s){
   int i,len=strlen(s),sum=0;
   for(i=0;i<len;i++){
      if(s[i]=='M')sum+=1000;
      else if(s[i]=='D')sum+=500;
      else if(s[i]=='L')sum+=50;
      else if(s[i]=='V')sum+=5;
      else if(s[i]=='C'){
         if(s[i+1]=='D'||s[i+1]=='M')sum-=100;
         else sum+=100;
      }
      else if(s[i]=='X'){
         if(s[i+1]=='L'||s[i+1]=='C')sum-=10;
         else sum+=10;
      }
      else{
         if(s[i+1]=='V'||s[i+1]=='X')sum-=1;
         else sum+=1;
      }
   }
   return sum;
}

 

方法二

罗马字符转化为对应数字,利用start指针比较相邻两位数的大小

该数比后面的数大,直接加后面的数,指针右移

该数比后面的数小,加后面的数再减去两倍前面的数

如IV 对应1 5 sum=1 

1<5 sum=sum+5-2*1=4

int Convert(char a){
    int t;
    if(a=='I')t=1;
    else if(a=='V')t=5;
    else if(a=='X')t=10;
    else if(a=='L')t=50;
    else if(a=='C')t=100;
    else if(a=='D')t=500;
    else t=1000;
    return t;
}
int romanToInt(char * s){
   int i,len=strlen(s);
   int a[20]={};
   for(i=0;i<len;i++){
     a[i]=Convert(s[i]);
   }
   int start=0,sum=a[0];
   for(i=1;i<len;i++){
        if(a[start]>=a[i]) sum+=a[i];
        else sum=sum+a[i]-2*a[start];
        start++;
   }
   return sum;
}

 

12 整数转罗马数字

七个不同的符号代表罗马数字,其值如下:

符号    值
I    1
V    5
X    10
L    50
C    100
D    500
M    1000
罗马数字是通过添加从最高到最低的小数位值的转换而形成的。将小数位值转换为罗马数字有以下规则:

如果该值不是以 4 或 9 开头,请选择可以从输入中减去的最大值的符号,将该符号附加到结果,减去其值,然后将其余部分转换为罗马数字。
如果该值以 4 或 9 开头,使用 减法形式,表示从以下符号中减去一个符号,例如 4 是 5 (V) 减 1 (I): IV ,9 是 10 (X) 减 1 (I):IX。仅使用以下减法形式:4 (IV),9 (IX),40 (XL),90 (XC),400 (CD) 和 900 (CM)。
只有 10 的次方(I, X, C, M)最多可以连续附加 3 次以代表 10 的倍数。你不能多次附加 5 (V),50 (L) 或 500 (D)。如果需要将符号附加4次,请使用 减法形式。
给定一个整数,将其转换为罗马数字。

 

示例 1:

输入:num = 3749

输出: "MMMDCCXLIX"

解释:

3000 = MMM 由于 1000 (M) + 1000 (M) + 1000 (M)
 700 = DCC 由于 500 (D) + 100 (C) + 100 (C)
  40 = XL 由于 50 (L) 减 10 (X)
   9 = IX 由于 10 (X) 减 1 (I)
注意:49 不是 50 (L) 减 1 (I) 因为转换是基于小数位
示例 2:

输入:num = 58

输出:"LVIII"

解释:

50 = L
 8 = VIII
示例 3:

输入:num = 1994

输出:"MCMXCIV"

解释:

1000 = M
 900 = CM
  90 = XC
   4 = IV
 

提示:

1 <= num <= 3999

解题思路:

分离整数每一位,对每一位进行分析,如1994

千位 1 对应M

百位 9 对应CM

十位 9 对应 XC

个位 4 对应IV

利用二维数组和strcpy函数,注意strcpy从字符串结尾开始拷贝,所以a[0]='\n'

从0开始拷贝,头文件为string.h

const char* thousands[]={"","M","MM","MMM"};
const char* hundreds[]={"","C","CC","CCC","CD","D","DC","DCC","DCCC","CM"};
const char* tens[]={"","X","XX","XXX","XL","L","LX","LXX","LXXX","XC"};
const char* ones[]={"","I","II","III","IV","V","VI","VII","VIII","IX"};
char* intToRoman(int num) {
    char* a=malloc(sizeof(char)* 16);
    a[0]='\0';//要让第一个元素为空值
    int q=num/1000,b=num%1000/100,s=num%100/10,g=num%10;
    strcpy(a+strlen(a),thousands[q]);
    strcpy(a+strlen(a),hundreds[b]);
    strcpy(a+strlen(a),tens[s]);
    strcpy(a+strlen(a),ones[g]);
    return a;
}

 

 

;