• 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.

    分析

    罗马数字字符串转化成整数

    罗马数字:

    采用七个罗马字母作数字、即Ⅰ(1)、X(10)、C(100)、M(1000)、V(5)、L(50)、D(500)。

    有两条须注意掌握:

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

    举例:

    个位数
    Ⅰ-1、Ⅱ-2、Ⅲ-3、Ⅳ-4、Ⅴ-5、Ⅵ-6、Ⅶ-7、Ⅷ-8、Ⅸ-9

    十位数
    X-10、Ⅺ-11、Ⅻ-12、XIII-13、XIV-14、XV-15、XVI-16、XVII-17、XVIII-18、XIX-19、XX-20、XXI-21、XXII-22、XXIX-29、XXX-30、XXXIV-34、XXXV-35、XXXIX-39、XL-40、L-50、LI-51、LV-55、LX-60、LXV-65、LXXX-80、XC-90、XCIII-93、XCV-95、XCVIII-98、XCIX-99

    百位数
    C-100、CC-200、CCC-300、CD-400、D-500、DC-600、DCC-700、DCCC-800、CM-900、CMXCIX-999

    千位数
    M-1000、MC-1100、MCD-1400、MD-1500、MDC-1600、MDCLXVI-1666、MDCCCLXXXVIII-1888、MDCCCXCIX-1899、MCM-1900、MCMLXXVI-1976、MCMLXXXIV-1984、MCMXC-1990、MM-2000、MMMCMXCIX-3999

    千位:M-1000、MM-2000、MMM-3000

    百位:C-100、CC-200、CCC-300、CD-400、D-500、DC-600、DCC-700、DCCC-800、CM-900

    十位:X-10、XX-20、XXX-30、XL-40、L-50、LX-60、LXX-70、LXXX-80、XC-90

    个位:I-1、II-2、III-3、IV-4、V-5、VI-6、VII-7、VIII-8、IX-9

    解答

    解法1:(我)逐位判断(千-百-十-个)(96ms)

    从头开始遍历输入字符串,每位数从大到小遍历,结束后移动指针,移动长度为相应位的字符串长度

    public class Solution {
        public int romanToInt(String s) {
            String roman[][] = {
                {"","M","MM","MMM"},
                {"","C","CC","CCC","CD","D","DC","DCC","DCCC","CM"},
                {"","X","XX","XXX","XL","L","LX","LXX","LXXX","XC"},
                {"","I","II","III","IV","V","VI","VII","VIII","IX"}};
            
            int result[] = new int[4];
            int p = 0;
            for (int i = 0; i < roman.length; i++){
                for (int j = roman[i].length - 1; j >= 0; j--){//每行从右到左遍历(每位数从大到小遍历)
                    if (s.indexOf(roman[i][j],p) - p == 0){
                        result[i] = j;
                        p += roman[i][j].length();
                        break;
                    }
                }
            }
            return result[0] * 1000 + result[1] * 100 + result[2] * 10 + result[3];    
        }
    }
    


    解法2:数字拆分,不再作为整体(82ms√)

    输入字符串从右到左遍历,对不同字符做不同处理

    Ⅰ(1):如果已经遍历出的值>=5,则-1;否则,+1

    X(10):如果已经遍历出的值>=50,则-10;否则,+10

    C(100):如果已经遍历出的值>=500,则-100;否则,+100

    M(1000)、V(5)、L(50)、D(500):直接加对应的数

    public class Solution {
        public int islandPerimeter(int[][] grid) {
            int perimeter = 0;
            for (int i = 0; i < grid.length; i++){
                for (int j = 0; j < grid[0].length; j++){
                    if (grid[i][j] == 1){
                        if (i == 0 || grid[i-1][j] == 0){perimeter++;}//up
                        if (j == 0 || grid[i][j-1] == 0){perimeter++;}//left
                        if (i == grid.length - 1 || grid[i+1][j] == 0){perimeter++;}//down
                        if (j == grid[0].length - 1 || grid[i][j+1] == 0){perimeter++;}//right
                    }
                    
                }
            }
            return perimeter;
        }
    }
    
  • 相关阅读:
    chrome书签插件
    Js箭头函数和lambda
    CSS水平或垂直居中技巧
    前端需要注意的SEO优化
    OpenCV图像识别初探-50行代码教机器玩2D游戏
    机器学习笔记(十一)----降维
    基于Docker搭建分布式消息队列Kafka
    一个经典面试题:如何保证缓存与数据库的双写一致性?
    Flask 蓝图机制及应用
    软件开发团队如何管理琐碎、突发性任务
  • 原文地址:https://www.cnblogs.com/xuehaoyue/p/6413372.html
Copyright © 2020-2023  润新知