题目:罗马数字转整数
罗马数字包含以下七种字符: I
, V
, X
, L
,C
,D
和 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的情况。