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;
}
總結:這道題目是簡單題,做出來了還是蠻開心的嘻嘻