乘风破浪:LeetCode真题_013_Roman to Integer

乘风破浪:LeetCode真题_013_Roman to Integer

一、前言

上一节我们讨论了如何把阿拉伯数字转换成罗马数字,现在我们需要思考一下如何把罗马数字转换成阿拉伯数字,其实我们仔细观擦这些结构就会发现罗马数字如果前面的比后面的小,就需要用后面的减去前面的。而且如果有这样的运算,也只是两个字符拼接而成的,这为我们解题提供了思路。

二、Roman to Integer

2.1 问题

2.2 分析与解决

根据题意,我们可以明白只需要从开始到结尾遍历这些罗马数字,如果发现前一个小于后一个代表的数字,则用后面的数值减去前面的数值,然后将这些数值相加在一起,这样就能得到最终的结果了。同样的我们也可以从后往前遍历,如果发现前面的小于后面的就进行减法操作,否则直接相加也是可以的。当然这一切都要依靠于给定的罗马数字是正确的前提下。

于是有了两种方式:从前往后,从后往前。

从前往后:

class Solution {
    public int romanToInt(String s) {
        if(s== null) return 0;
        Map<Character, Integer> map= new HashMap<>();
        map.put(‘I‘, 1);
        map.put(‘V‘, 5);
        map.put(‘X‘, 10);
        map.put(‘L‘, 50);
        map.put(‘C‘, 100);
        map.put(‘D‘, 500);
        map.put(‘M‘, 1000);
        int sum = 0;
    for(int i=0;i<s.length();i++) {
        if((i+1 < s.length()) && map.get(s.charAt(i+1)) > map.get(s.charAt(i))) {
            sum = sum + (map.get(s.charAt(i+1)) - map.get(s.charAt(i)));
            i++;
        }else{
            sum = sum + map.get(s.charAt(i));
        }
    }
        return sum;

    }
}

  从后往前:

public class Solution {
    /**
     * 题目大意
     * 给定一个罗马数字,将其转换成对应的整数。
     * 输入的数字在1-3999之间。
     *
     * 解题思路
     * 根据罗马数字与整数数字对应关系进行加法操作,从后向前遍历,如果前一个数字比后一个大就相减,否则进行相加。
     */
    public int romanToInt(String s) {

        int result = 0;
        int prev = 0; // 记录前一个数字的值

        for (int i = s.length() - 1; i >= 0; i--) {
            switch (s.charAt(i)) {
                case ‘I‘: // 1
                    if (1 < prev) {
                        result -= 1;
                    } else {
                        result += 1;

                    }
                    prev = 1;
                    break;

                case ‘V‘: // 5

                    if (5 < prev) {
                        result -= 5;
                    } else {
                        result += 5;
                    }

                    prev = 5;

                    break;
                case ‘X‘: // 10
                    if (10 < prev) {
                        result -= 10;
                    } else {
                        result += 10;
                    }

                    prev = 10;
                    break;
                case ‘L‘: // 50
                    if (50 < prev) {
                        result -= 50;
                    } else {
                        result += 50;
                    }

                    prev = 50;
                    break;
                case ‘C‘: // 100
                    if (100 < prev) {
                        result -= 100;
                    } else {
                        result += 100;
                    }

                    prev = 100;
                    break;
                case ‘D‘: // 500
                    if (500 < prev) {
                        result -= 500;
                    } else {
                        result += 500;
                    }

                    prev = 500;
                    break;
                case ‘M‘: // 1000
                    result += 1000;
                    prev = 1000;
                    break;
            }
        }

        return result;
    }
}

三、总结

同样的思路,有的代码写得非常具有条理性,有的写得比较复杂,运行之后的耗时也是不同的,因此需要软件工程技术上的培养。

原文地址:https://www.cnblogs.com/zyrblog/p/10213658.html

时间: 2024-09-30 18:39:14

乘风破浪:LeetCode真题_013_Roman to Integer的相关文章

乘风破浪:LeetCode真题_008_String to Integer (atoi)

乘风破浪:LeetCode真题_008_String to Integer (atoi) 一.前言 将整型转换成字符串,或者将字符串转换成整型,是经常出现的,也是必要的,因此我们需要熟练的掌握,当然也有很多工具来实现了,但是在这个基础上加入一些其他的因素就是考点的所在了. 二.String to Integer (atoi) 2.1 问题理解 2.2 问题分析和解决     看到这个问题,我们就需要遍历字符串,然后判断开始的时候是不是空格,+,-,或者数字,如果不是的话就是不合理的,如果是,则继

乘风破浪:LeetCode真题_007_Reverse Integer

乘风破浪:LeetCode真题_007_Reverse Integer 一.前言 这是一个比较简单的问题了,将整数翻转,主要考察了取整和取余,以及灵活地使用long型变量防止越界的问题. 二.Reverse Integer 2.1 问题理解 2.2 问题分析与解决    可以看到通过简单地取整和取余运算就能得到答案,但是需要注意越界问题,使用long在Java中8个字节的特性来完成越界检查和处理.    我们的算法: public class Solution { /** * <pre> *

乘风破浪:LeetCode真题_040_Combination Sum II

乘风破浪:LeetCode真题_040_Combination Sum II 一.前言 这次和上次的区别是元素不能重复使用了,这也简单,每一次去掉使用过的元素即可. 二.Combination Sum II 2.1 问题 2.2 分析与解决 通过分析我们可以知道使用递归就可以解决问题,并且这次我们从头遍历一次就不会出现多次使用某一个元素了. class Solution { List<List<Integer>> ans; public List<List<Intege

乘风破浪:LeetCode真题_002_Add Two Numbers

乘风破浪:LeetCode真题_002_Add Two Numbers 一.前言     这次的题目是关于链表方面的题目,把两个链表对应节点相加,还要保证进位,每个节点都必须是十进制的0~9.因此主要涉及到链表,指针方面的知识,以及活学活用的编程能力. 二.LeetCode真题_002_Add Two Numbers 2.1 问题介绍 2.2 分析与解决 看到这样的问题,我们首先要分析清题意,之后画出一个原理图,然后就便于解决了.可以看到主要是包括了进位的问题,因此我们每一次相加的时候需要考虑到

乘风破浪:LeetCode真题_021_Merge Two Sorted Lists

乘风破浪:LeetCode真题_021_Merge Two Sorted Lists 一.前言 关于链表的合并操作我们是非常熟悉的了,下面我们再温故一下将两个有序链表合并成一个的过程,这是基本功. 二.Merge Two Sorted Lists 2.1 问题 2.2  分析与解决 这是比较简单的,将两个已经有序的链表合并成一个,只需要两个指针不断的遍历和比较,判断谁的大以此来变换指针即可. /** * Definition for singly-linked list. * public cl

乘风破浪:LeetCode真题_024_Swap Nodes in Pairs

乘风破浪:LeetCode真题_024_Swap Nodes in Pairs 一.前言 这次还是链表的操作,不过我们需要交换链表奇数和偶数位置上的节点,因此要怎么做呢? 二.Swap Nodes in Pairs 2.1 问题      要求是不能修改节点的元素,并且使用的空间也是常数级别的,不能使用更高的内存空间. 2.2 分析与解决      通过分析我们可以使用简单的遍历算法,通过四个指针来解决,当然我们也可以使用递归算法来解答. 使用正常遍历算法: public class Solut

乘风破浪:LeetCode真题_026_Remove Duplicates from Sorted Array

乘风破浪:LeetCode真题_026_Remove Duplicates from Sorted Array 一.前言     我们这次的实验是去除重复的有序数组元素,有大体两种算法. 二.Remove Duplicates from Sorted Array 2.1 问题      题目大意理解,就是对数组进行元素去重,然后返回去处重复之后的长度,无论我们对数组做了什么的修改,都没有关系的,只要保证再返回的长度之内的数组正确性即可.因为最后是根据长度来遍历的,因此我们不用担心. 2.2 分析

乘风破浪:LeetCode真题_025_Reverse Nodes in k-Group

乘风破浪:LeetCode真题_025_Reverse Nodes in k-Group 一.前言 将一个链表按照一定的长度切成几部分,然后每部分进行翻转以后再拼接成一个链表是比较困难的,但是这也能锻炼我们的思维能力. 二.Reverse Nodes in k-Group 2.1 问题 2.2 分析与解决     最简单的想法,我们可以将链表分成几部分,每一个部分分开考虑,比如使用头插法,正好可以将顺序颠倒一下,或者我们通过某种方式使得顺序发生改变,然后再结合起来. /** * Definiti

乘风破浪:LeetCode真题_027_Remove Element

乘风破浪:LeetCode真题_027_Remove Element 一.前言 这次是从数组中找到一个元素,然后移除该元素的所有结果,并且返回长度. 二.Remove Element 2.1 问题 2.2 分析与解决     这个题和上一题是非常相似的,只不过这次是从数组中找到给定的元素,并且删除该元素,同时返回剩余数组的长度,超过长度的元素不用管,存不存在都可以.于是我们想到了和上次一样的方法,用一个指针指向开始,一个指向结尾,开始的向后移动,如果遇到需要删除的元素,则用最后的元素替代,最后的