7.7 12. 整数转罗马数字
七个不同的符号代表罗马数字,其值如下:
符号 | 值 |
---|---|
I | 1 |
V | 5 |
X | 10 |
L | 50 |
C | 100 |
D | 500 |
M | 1000 |
罗马数字是通过添加从最高到最低的小数位值的转换而形成的。将小数位值转换为罗马数字有以下规则:
- 如果该值不是以 4 或 9 开头,请选择可以从输入中减去的最大值的符号,将该符号附加到结果,减去其值,然后将其余部分转换为罗马数字。
- 如果该值以 4 或 9 开头,使用 减法形式,表示从以下符号中减去一个符号,例如 4 是 5 (
V
) 减 1 (I
):IV
,9 是 10 (X
) 减 1 (I
):IX
。仅使用以下减法形式:4 (IV
),9 (IX
),40 (XL
),90 (XC
),400 (CD
) 和 900 (CM
)。 - 只有 10 的次方(
I
,X
,C
,M
)最多可以连续附加 3 次以代表 10 的倍数。你不能多次附加 5 (V
),50 (L
) 或 500 (D
)。如果需要将符号附加4次,请使用 减法形式。
给定一个整数,将其转换为罗马数字。
我的思路:在看到“最大值”的时候,心里面就在想能不能使用贪心,最大的->贪心,每次找最大的
数字排列:1000 900 500 400 100 90 50 40 10 9 5 4 1
试了一下案例发现是可以的
循环数字排列,让num/数字为res,如果是=0的话就下一个循环数字,如果是>0的话,就要减去res*数字,添加罗马数字到ans,罗马数字和数字的映射也是map,循环一直到num<=0为止。
有几个错误点:
num/数字为res:生成的是浮点数,使用向下取整得到数字
加罗马数字到ans:我循环的时候添加的下表有问题
我的代码:
function intToRoman(num: number): string {let ans = '';
let RomanMap = new Map([[1000, 'M'],[900, 'CM'],[500, 'D'],[400, 'CD'],[100, 'C'],[90, 'XC'],[50, 'L'],[40, 'XL'],[10, 'X'],[9, 'IX'],[5, 'V'],[4, 'IV'],[1, 'I']
]);const choseNum = [ 1000 ,900, 500, 400, 100, 90, 50 ,40 ,10, 9, 5, 4, 1, ]for(let i = 0; i < choseNum.length ; i++){let res =Math.floor( num / choseNum[i]);//使用向下取整console.log(res);;if(res != 0){// 能够有数字num -= res * choseNum[i];console.log(num);for(let j = 0 ; j < res ; j++){ans += RomanMap.get(choseNum[i]);//下标是i}}if(num === 0){return ans;}}return ans;
};
总结:本题目在上一个题目上有所提升,很高兴的是我看到了最大值就想到了贪心算法,耶耶耶继续加油!
7.7 .58. 最后一个单词的长度
给你一个字符串 s
,由若干单词组成,单词前后用一些空格字符隔开。返回字符串中 最后一个 单词的长度。
单词 是指仅由字母组成、不包含任何空格字符的最大子字符串。
我的思路:
前后去掉空格
最后一个单词,直接从最后开始,如果遇到空格就直接返回count
但是有一个特例,就是类似于’day’这种,它是没有空格的,那么我们就设置一个指针在最前面
如果说i等于j了就直接返回count
我的代码:
function lengthOfLastWord(s: string): number {// 先把前后的空格去掉let newStr = s.trim();// 最后一个单词,直接从最后开始let i = newStr.length - 1;// 第一个单词let j = 0;let count = 0;while(newStr[i] !== ' '){count ++;if(i === j){return count;}i--;}return count;
}
总结:这道题目是简单题,做出来了还是蛮开心的嘻嘻