力扣一日多练(3)——罗马数字转整数、两数相加、反转链表

 

题目:罗马数字转整数

罗马数字包含以下七种字符: I, V, X, LCD 和 M

例如, 罗马数字 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 到 3999 的范围内。

示例:

输入: "III"
输出: 3
输入: "IV"
输出: 4
输入: "IX"
输出: 9
输入: "LVIII"
输出: 58
解释: L = 50, V= 5, III = 3.
输入: "MCMXCIV"
输出: 1994
解释: M = 1000, CM = 900, XC = 90, IV = 4.


使用语言JavaScript:

/**
 * @param {string} s
 * @return {number}
 */
var romanToInt = function(s) {
    var long = s.length;
    var i=0;
    var num=0;
    for(i=0;i<long;i++){
        switch(s.charAt(i))
        {
            case 'I': num=num+1;break;    
            case 'V': num=num+5;break; 
            case 'X': num=num+10;break;
            case 'L': num=num+50;break; 
            case 'C': num=num+100;break; 
            case 'D': num=num+500;break;
            case 'M': num=num+1000;break; 
        }
            if((s.charAt(i)=='V' || s.charAt(i)=='X') && s.charAt(i-1)=='I'){
                num=num-2;
            }
            if((s.charAt(i)=='L' || s.charAt(i)=='C') && s.charAt(i-1)=='X'){
                num=num-20;
            }
            if((s.charAt(i)=='D' || s.charAt(i)=='M') && s.charAt(i-1)=='C'){
                num=num-200;
            }
        
        
    }
    return num;
};

分析:

因为是要从罗马数字(英文字母)转变为数字,所有我准备使用switch语句,通过case将其进行转换。通过 .length的方式得到s的字符串长度。

字符串名.charAt() 可以返回在指定位置的字符。所以使用for循环来遍历s的每一个字符,定义变量num为最终相加的数值,如果case得到I则num加1,V则加10,其他字母类似。

但是有六种特殊的情况,I 可以放在 V (5) 和 X (10) 的左边,来表示 4 和 9,最后得数会比在右边的情况小2。X 可以放在 L (50) 和 C (100) 的左边,来表示 40 和 90,最后得数会比在右边的情况小20。C 可以放在 D (500) 和 M (1000) 的左边,来表示 400 和 900,最后得数会比在右边的情况小200。所以我使用了三句if语句进行判断。

 

题目:两数相加

给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。

如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。

您可以假设除了数字 0 之外,这两个数都不会以 0 开头。

示例:

输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807

使用语言JavaScript:

/**
 * Definition for singly-linked list.
 * function ListNode(val) {
 *     this.val = val;
 *     this.next = null;
 * }
 */
/**
 * @param {ListNode} l1
 * @param {ListNode} l2
 * @return {ListNode}
 */
var addTwoNumbers = function(l1, l2) {
    var result=new ListNode(0);
    var num=0;
    var ne=result;

    while(l1!=null||l2!=null)
    {
        if(l1!=null){
            var n1=l1.val ;
        }else{ var n1 = 0; }
        if(l2!=null){
            var n2=l2.val ;
        }else{ var n2 = 0; }
        var sum = n1+n2+num;
        if(sum>9){
            num=1;
        }else{
            num=0;
        }
        result.next = new ListNode(sum%10);
        result = result.next;
        if(l1!=null)  l1=l1.next;
        if(l2!=null)  l2=l2.next;
    }
    if(num==1){
        result.next = new ListNode(num);
    }
    return ne.next;

};

分析:

在这里给出的l1和l2都是单链表,我对链表的知识有一些陌生,所以当时我做这道题的时候做了很久,参考了一些评论中的方法。这题有一个陷阱,最起码我是掉进去了。我当时因为看题目是说链表的位数是倒序排列的,所以我直接先是把链表排列回了正序,但是我后来发现根本不需要,因为最后我们输出的结果也要是一个倒序的,即一开始从链表头开始相加,向后进位即可。

首先我需要对链表l1和l2做一个判断,判断这两链表是否非空,如果链表l1为空,则n1=0,否则n1=l1.val(l1该位置的值)。定义变量sum,sum是n1+n2的数值,并且做判断sum是否超过10,超过需要进位,使变量num=1。

将sum值除10取余存入链表result,加入判断num==1,如果是,说明数值相加进位。result的链表位数需要+1。

注意在return 返回结果时还有一个小陷阱,直接返回ne将会将链表首位的0也显示出来。

题目:反转链表

反转一个单链表。

示例:

输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL

使用语言JavaScript:

/**
 * Definition for singly-linked list.
 * function ListNode(val) {
 *     this.val = val;
 *     this.next = null;
 * }
 */
/**
 * @param {ListNode} head
 * @return {ListNode}
 */
var reverseList = function(head) {
    var list = head;
    var p = list;
    var q= null;
    if(p == null){
        return null;
    }
    while(p.next !== null) {
        q = p.next;
        p.next = q.next;
        q.next = list;
        list = q;     
    }
    return list;

};

 分析:

因为上一道两数相加链表的与这道有点相似,并且这道题目是我之前阅读另一篇博客进行参考的,所以干脆就发代码了,要注意的只有别忘了判断链表一开始就为null的情况。

猜你喜欢

转载自blog.csdn.net/qq_36171287/article/details/89421042