美文网首页
iOS算法系列(三)--罗马数字转整数

iOS算法系列(三)--罗马数字转整数

作者: 乐一游 | 来源:发表于2018-08-25 21:41 被阅读0次

难易度:易
题目:罗马数字包含以下七种字符:IVXLCDM

数字 字符
I 1
V 5
X 10
L 50
C 100
D 500
M 1000

例如, 罗马数字 2 写做 II ,即为两个并列的 112 写做 XII ,即为 X + II27 写做 XXVII, 即为 XX + V + II

通常情况下,罗马数字中小的数字在大的数字的右边。但也存在特例,例如 4 不写做 IIII,而是 IV。数字 1 在数字 5 的左边,所表示的数等于大数 5 减小数 1 得到的数值 4 。同样地,数字 9 表示为 IX。这个特殊的规则只适用于以下六种情况:

I 可以放在 V (5) 和 X (10) 的左边,来表示 49
X 可以放在 L (50) 和 C (100) 的左边,来表示 4090
C 可以放在 D (500) 和 M (1000) 的左边,来表示 400900
给定一个罗马数字,将其转换成整数。输入确保在 13999 的范围内。

思路:
1:从最左边依次读取字符,如果是I X C的话继续读取下一个字符,判断这两个字符是不是IV IX XL XC CD CM,如果是的话就取相应的数据累加,如果不是就获取相应的数据累加
2:依次遍历循环直至最后一个字符,返回转换结果

代码如下,已经下Xcode上编译运行,并输出正确结果

-(NSInteger)romanToInt:(NSString*)roman
{
    if([roman integerValue] > 3999 || [roman integerValue] < 1)
    {
        return 0;
    }
    NSInteger result = 0;
    NSInteger romanLen = roman.length;
    NSInteger start = 0;
    if (romanLen == 1)
    {
        result = [self singleRoman:roman];
    }
    else
    {
        while (start < romanLen)
        {
            NSString *temp = [roman substringWithRange:NSMakeRange(start, 1)];
            if ([temp isEqualToString:@"I"] || [temp isEqualToString:@"X"] || [temp isEqualToString:@"C"])
            {
                if (romanLen - start >= 2)
                {
                    NSString *str = [roman substringWithRange:NSMakeRange(start, 2)];
                    if ([str isEqualToString:@"IV"] || [str isEqualToString:@"IX"] || [str isEqualToString:@"XL"] || [str isEqualToString:@"XC"] || [str isEqualToString:@"CD"] || [str isEqualToString:@"CM"] )
                    {
                        result += [self singleRoman:str];
                        start += 2;
                    }
                    else
                    {
                        result += [self singleRoman:temp];
                        start += 1;
                    }
                }
                else
                {
                    result += [self singleRoman:temp];
                    start += 1;
                }
            }
            else
            {
                result += [self singleRoman:temp];
                start += 1;
            }
        }
    }
    NSLog(@"返回的数字为%ld", result);
    return result;
}
-(NSInteger)singleRoman:(NSString*)roman
{
    if ([roman isEqualToString:@"I"])
    {
        return 1;
    }
    else if ([roman isEqualToString:@"V"])
    {
        return 5;
    }
    else if ([roman isEqualToString:@"X"])
    {
        return 10;
    }
    else if ([roman isEqualToString:@"L"])
    {
        return 50;
    }
    else if ([roman isEqualToString:@"C"])
    {
        return 100;
    }
    else if ([roman isEqualToString:@"D"])
    {
        return 500;
    }
    else if ([roman isEqualToString:@"M"])
    {
        return 1000;
    }
    else if ([roman isEqualToString:@"IV"])
    {
        return 4;
    }
    else if ([roman isEqualToString:@"IX"])
    {
        return 9;
    }
    else if ([roman isEqualToString:@"XL"])
    {
        return 40;
    }
    else if ([roman isEqualToString:@"XC"])
    {
        return 90;
    }
    else if ([roman isEqualToString:@"CD"])
    {
        return 400;
    }
    else if ([roman isEqualToString:@"CM"])
    {
        return 900;
    }
    return 0;
}

相关文章

网友评论

      本文标题:iOS算法系列(三)--罗马数字转整数

      本文链接:https://www.haomeiwen.com/subject/ritniftx.html