【leetcode】13. Roman to Integer

题目描述:

Given a roman numeral, convert it to an integer.

解题思路:

罗马计数法有以下规则:

  1. 基本数字 Ⅰ、X 、C 中的任何一个、自身连用构成数目、或者放在大数的右边连用构成数目、都不能超过三个;放在大数的左边只能用一个;
  2. 不能把基本数字 V 、L 、D 中的任何一个作为小数放在大数的左边采用相减的方法构成数目;放在大数的右边采用相加的方式构成数目、只能使用一个;
  3. V 和 X 左边的小数字只能用 Ⅰ;
  4. L 和 C 左边的小数字只能用X;
  5. D 和 M 左边的小数字只能用 C。

所以只有I,X,C,可能出现在比他表示数字大的左边。因此,这道题可以从头开始扫描字符串,当遇到{I,X,C}时,看一下他们的下一个位置的值,若是大于他们表达值的数,则减去当前值,加上下一个值,并跳过扫描下一个字符。至于其他情况直接加上他们代表的数值即可。

具体代码:

 1 public class Solution {
 2      public  int romanToInt(String s){
 3          int[] value={1000,500,100,50,10,5,1};
 4          char[] array ="MDCLXVI".toCharArray();
 5
 6          int sum=0;
 7          for(int i=0;i<s.length();i++){
 8              char ch=s.charAt(i);
 9              int index=findIndex(array, ch);
10              if(index==2||index==4||index==6){
11                  if(i+1<s.length() && s.charAt(i+1)== array[index-1]){
12                      sum=sum+value[index-1]-value[index];
13                      i++;
14                  }
15                  else if(i+1<s.length() && s.charAt(i+1)== array[index-2]){
16                      sum=sum+value[index-2]-value[index];
17                      i++;
18                  }
19                  else{
20                      sum+=value[index];
21                  }
22              }
23              else{
24                  sum+=value[index];
25              }
26          }
27          return sum;
28      }
29      public static int findIndex(char[] array,char ch){
30          for(int i=0;i<array.length;i++){
31              if(array[i]==ch)
32                  return i;
33          }
34          return -1;
35      }
36 }
时间: 2024-10-26 03:35:05

【leetcode】13. Roman to Integer的相关文章

【LeetCode】6 - Roman to Integer

Given a roman numeral, convert it to an integer. Input is guaranteed to be within the range from 1 to 3999. Solution: 基本字符 I V X L C D M 相应的阿拉伯数字表示为 1 5 10 50 100 500 1000 个位数举例 Ⅰ-1.Ⅱ-2.Ⅲ-3.Ⅳ-4.Ⅴ-5.Ⅵ-6.Ⅶ-7.Ⅷ-8.Ⅸ-9 十位数举例 Ⅹ-10.Ⅺ-11.Ⅻ-12.XIII-13.XIV-14.

【LeetCode】013. Roman to Integer

Given a roman numeral, convert it to an integer. Input is guaranteed to be within the range from 1 to 3999. 题解: 只要知道罗马数字的规律即可 基本字符 I V X L C D M 相应的阿拉伯数字表示为 1 5 10 50 100 500 1000 1.相同的数字连写,所表示的数等于这些数字相加得到的数,如:Ⅲ = 3: 2.小的数字在大的数字的右边,所表示的数等于这些数字相加得到的数,

【leetcode】7 Roman to Integer

罗马字符转整数 注意事项: 1 几个罗马字符对应的整数 'I':  1; 'V':  5; 'X':  10; 'L':   50; 'C':  100; 'D':  500; 'M': 1000; 2 对于DC这种前者大于后者的好处理, 对于CD这种前者小于后者的,相当于C+D-2*C class Solution {public:    int toInt(char x){        switch(x){            case 'I': return 1;           

[LeetCode] NO.13 Roman to Integer

[题目] Given a roman numeral, convert it to an integer. 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). 用来表示数字的时候,如果相邻的两个罗马数字,前面表示的数字比后面的小,那么就要减去前面的

【LeetCode】008 String to Integer (atoi)

题目:LeetCode 008 String to Integer 题意:完成内置函数atoi的功能,将字符串转换成整数. 教训:一开始理所应当的随便一写,然后发现有很多的异常情况需要处理.然后按照C++ Reference中关于atoi的规定一条一条写,才AC.另外还有一个溢出的问题,一开始以为int会自动处理直接返回边界值,其实不是,如果溢出的话大于2147483647的数会给变成负数,因此要单独判断是否会大,但是设置成longlong 之后出现的问题是,还有可能会溢出longlong,所以

【LeetCode】8. String to Integer (atoi) 字符串转整数

题目: Implement atoi to convert a string to an integer. Hint: Carefully consider all possible input cases. If you want a challenge, please do not see below and ask yourself what are the possible input cases. Notes: It is intended for this problem to be

【LeetCode】8 - String to Integer (atoi)

Implement atoi to convert a string to an integer. Hint: Carefully consider all possible input cases. If you want a challenge, please do not see below and ask yourself what are the possible input cases. Notes: It is intended for this problem to be spe

【leetcode】1394. Find Lucky Integer in an Array

题目如下: Given an array of integers arr, a lucky integer is an integer which has a frequency in the array equal to its value. Return a lucky integer in the array. If there are multiple lucky integers return the largest of them. If there is no lucky inte

「Leetcode」13. Roman to Integer(Java)

分析 把具体的情况一个一个实现即可,没有什么幺蛾子. 代码 class Solution { public int romanToInt(String s) { int ans = 0; for (int i=0; i!=s.length(); ++i) { switch(s.charAt(i)) { case 'I': if(i<s.length()-1 && (s.charAt(i+1)=='X' || s.charAt(i+1)=='V')) { ans--; break; }