FCC 中级算法题 罗马数字转换器

Roman Numeral Converter


将给定的数字转换成罗马数字。

所有返回的 罗马数字 都应该是大写形式。

Roman Numerals

Array.splice()

Array.indexOf()

Array.join()

思路:

(1)把所给的数字拆分成数组;

(2)将其倒序之后利用索引与元素的关系将其转化为罗马字符(可以不倒序,不过就有些麻烦了);

(3) 再把它倒回来,然后合并,就是原来数字的罗马数字表现。

知识点:

(1)array=string.split(‘‘);

split()方法将一个String对象分割成字符串数组,通过将字符串分成子串。

1   var numString = "‘" + num + "‘";
2   arr = numString.split("");

(2)array.splice(start,deleteCount,item1,item2,...);

splice()方法通过删除现有元素和/或添加新元素来更改一个数组的内容;

1   arr.splice(0, 1);
2   arr.splice(arr.length - 1, 1);

(3)string = array.join("");

join() 方法将数组(或一个类数组对象)的所有元素连接到一个字符串中。

失误点:

这道题困了我三个小时,太特么蛋疼了!

因为一开始通过split方法产生的数组里的数字已经变成了字符型,而我的case 里面的匹配值还都是整形,所以用数字测试没问题,

一上arr[k]就没有结果,后来就都给case里的数字加了引号,大功告成!

 1  function changeRoman(k) {
 2
 3     var I, V, X;
 4     if (k === 0) {
 5       (I = "I"), (V = "V"), (X = "X");
 6     } else if (k === 1) {
 7       (I = "X"), (V = "L"), (X = "C");
 8     } else if (k === 2) {
 9       (I = "C"), (V = "D"), (X = "M");
10     }
11     var roman = "";
12     var idx = arr[k];
13     switch (idx) {
14       case "1":
15         roman = I;
16         break;
17       case "2":
18         roman = I + I;
19         break;
20       case "3":
21         roman = I + I + I;
22         break;
23       case "4":
24         roman = I + V;
25
26         break;
27       case "5":
28         roman = V;
29         break;
30       case "6":
31         roman = V + I;
32         break;
33       case "7":
34         roman = V + I + I;
35         break;
36       case "8":
37         roman = V + I + I + I;
38         break;
39       case "9":
40         roman = I + X;
41         break;
42     }
43     arr.splice(k, 1, roman);
44   }

总代码:

 1 function convert(num) {
 2   var arr = [];
 3   var numString = "‘" + num + "‘";
 4   arr = numString.split("");
 5   arr.splice(0, 1);
 6   arr.splice(arr.length - 1, 1);
 7   arr.reverse();
 8
 9   function changeRoman(k) {
10
11     var I, V, X;
12     if (k === 0) {
13       (I = "I"), (V = "V"), (X = "X");
14     } else if (k === 1) {
15       (I = "X"), (V = "L"), (X = "C");
16     } else if (k === 2) {
17       (I = "C"), (V = "D"), (X = "M");
18     }
19     var roman = "";
20     var idx = arr[k];
21     switch (idx) {
22       case "1":
23         roman = I;
24         break;
25       case "2":
26         roman = I + I;
27         break;
28       case "3":
29         roman = I + I + I;
30         break;
31       case "4":
32         roman = I + V;
33
34         break;
35       case "5":
36         roman = V;
37         break;
38       case "6":
39         roman = V + I;
40         break;
41       case "7":
42         roman = V + I + I;
43         break;
44       case "8":
45         roman = V + I + I + I;
46         break;
47       case "9":
48         roman = I + X;
49         break;
50     }
51     arr.splice(k, 1, roman);
52   }
53
54   function changeRoman1(k) {
55     var roman = "";
56     var idx = arr[k];
57     for (var p = 0; p < idx; p++) {
58       roman = roman + "M";
59     }
60     arr.splice(k, 1, roman);
61   }
62   if (arr.length < 4) {
63     for (var k = 0; k < arr.length; k++) {
64       changeRoman(k);
65     }
66   } else if (arr.length == 4) {
67     for (var l = 0; l < 3; l++) {
68       changeRoman(l);
69     }
70     changeRoman1(3);
71   }
72   arr.reverse();
73   arr = arr.join("");
74   return arr;
75 }
76
77 convert(3612);
时间: 2024-07-29 10:24:21

FCC 中级算法题 罗马数字转换器的相关文章

FCC 中级算法题 Binary Agents

Binary Agents 传入二进制字符串,翻译成英语句子并返回. 二进制字符串是以空格分隔的. String.charCodeAt() String.fromCharCode() 思路: (1)把字符串转化为数组: (2)把数组中的二进制转化为十进制: (3)把数组中的十进制数字转化为字母: (4)把数组转化为字符串: 知识点 (1)String.split()方法将一个String对象分割成字符串数组,通过将字符串分成子串; (2)parseInt(string,num) num代表num

FCC 中级算法题 找到缺失的字母

Missing letters 从传递进来的字母序列中找到缺失的字母并返回它. 如果所有字母都在序列中,返回 undefined. String.charCodeAt() String.fromCharCode() 思路: (1)直接将字符串转化为数字按顺序放入数组arr中; (2)如果没有缺失的字母,数组的最大值减最小值加1应该等于数组的长度,利用这一特点,创建这样一个理想的没有缺失的数组newArr; (3)从newArr中剔除与数组arr相同的元素,这样就找到了丢失字母的数字,由于可能不止

FCC 中级算法题 对所有的数字求和

题干: 我们会传递给你一个包含两个数字的数组.返回这两个数字和它们之间所有数字的和. 最小的数字并非总在最前面. 1 function sumAll(arr) { 2 return 1; 3 } 4 5 sumAll([1, 4]); 会用到的函数 Math.max() Math.min() Array.reduce() 思路: (1)通过Math.max(),Math.min()抽出数组中的最大值max和最小值min: (2)创建新数组获取最小值和最大值之间的数值: (3)利用Array.re

FCC 中级算法题 数组扁平化

Steamroller 对嵌套的数组进行扁平化处理.你必须考虑到不同层级的嵌套. Array.isArray() 思路: (1)遍历arr,如果arr[i]是数组,就重新调用本函数继续循环,然后和新数组连接; (2)如果不是数组,就直接添加进新数组: 知识点: (1)Array.concat()方法用于合并两个或多个数组.此方法不会更改现有数组,而是返回一个新数组; (2)Array.push()方法将一个或多个元素添加到数组的末尾,并返回数组的新长度; (3)Array.isArray()用于

FCC 中级算法题 所有素数之和

Sum All Primes 求小于等于给定数值的质数之和. 只有 1 和它本身两个约数的数叫质数.例如,2 是质数,因为它只能被 1 和 2 整除.1 不是质数,因为它只能被自身整除. 给定的数不一定是质数. For Loops Array.push() 思路: 找出从0到num之间所有的质数,然后遍历累加: 知识点: 质数除2到自己本身(不包含)都不会整除: 失误: 我把拿来确定a是否可以整除的b放到了全局中,这导致a每次循环但b的值不会变化,后来我将b声明到了a的循环中: 代码: 1 fu

FCC 中级算法题 碱基配对

DNA Pairing DNA 链缺少配对的碱基.依据每一个碱基,为其找到配对的碱基,然后将结果作为第二个数组返回. Base pairs(碱基对) 是一对 AT 和 CG,为给定的字母匹配缺失的碱基. 在每一个数组中将给定的字母作为第一个碱基返回. 例如,对于输入的 GCG,相应地返回 [["G", "C"], ["C","G"],["G", "C"]] 字母和与之配对的字母在一个数组

fcc中级算法题

1 Sum All Numbers in a Range 我们会传递给你一个包含两个数字的数组.返回这两个数字和它们之间所有数字的和. 最小的数字并非总在最前面. 如果你被难住了,记得使用 Read-Search-Ask.尝试与他人结伴编程.编写你自己的代码. 这是一些对你有帮助的资源: Math.max() Math.min() Array.reduce()

FCC 中级算法题 Drop it

Drop it 让我们来丢弃数组(arr)的元素,从左边开始,直到回调函数return true就停止. 第二个参数,func,是一个函数.用来测试数组的第一个元素,如果返回fasle,就从数组中抛出该元素(注意:此时数组已被改变),继续测试数组的第一个元素,如果返回fasle,继续抛出,直到返回true. 最后返回数组的剩余部分,如果没有剩余,就返回一个空数组. Arguments object Array.shift() Array.slice() 思路: (1)先获得数组的长度(在后面的循

FCC 中级算法题 Finders Keepers

Finders Keepers 写一个 function,它遍历数组 arr,并返回数组中第一个满足 func 返回值的元素.举个例子,如果 arr 为 [1, 2, 3],func 为 function(num) {return num === 2; },那么 find 的返回值应为 2. Array.filter() 没有用到filter,感觉用了之后更麻烦了 代码: 1 function find(arr, func) { 2 3 for(var i=0;i<arr.length;i++)