12. 整数转罗马数字
没做出来,去看题解…
重点:罗马数字的唯一表示法
①模拟
1=
var intToRoman = function(num) {
// 建立数值-符号对数组 从大到小排列
const val_sym=[[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 ans=[];
for(const [val,sym] of val_sym){
// 寻找不超过 num 的最大符号值
while(num>=val){
num-=val;
ans.push(sym);
}
if(num==0) break;
}
return ans.join('');
};
时间复杂度:O(1)
。由于val_sym
长度是固定的,且这13
字符中的每个字符的出现次数均不会超过33
,因此循环次数有一个确定的上限。对于本题给出的数据范围,循环次数不会超过15
次。
空间复杂度:O(1)
。
②硬编码数字
由罗马数字的唯一表示法中的13个符号可以发现:
var intToRoman = function(num) {
const thousands = ["", "M", "MM", "MMM"];
const hundreds = ["", "C", "CC", "CCC", "CD", "D", "DC", "DCC", "DCCC", "CM"];
const tens = ["", "X", "XX", "XXX", "XL", "L", "LX", "LXX", "LXXX", "XC"];
const ones = ["", "I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX"];
const ans=[];
// 利用模运算和除法运算,得到num每个位上的数字
ans.push(thousands[Math.floor(num/1000)]);
ans.push(hundreds[Math.floor(num%1000/100)]);
ans.push(tens[Math.floor(num%100/10)]);
ans.push(ones[Math.floor(num%10)]);
return ans.join('');
};
时:O(1)
空:O(1),计算量与输入数字的大小无关
49. 字母异位词分组
题目: 给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。
字母异位词 是由重新排列源单词的字母得到的一个新单词,所有源单词中的字母通常恰好只用一次。
力扣官方解法:使用哈希表存储每一组字母异位词,哈希表的键为一组字母异位词的标志,哈希表的值为一组字母异位词列表。
遍历每个字符串,对于每个字符串,得到该字符串所在的一组字母异位词的标志,将当前字符串加入该组字母异位词的列表中。遍历全部字符串之后,哈希表中的每个键值对即为一组字母异位词。
以下两种方法分别使用排序和计数作为哈希表的键。
①排序
将排序之后的字符串作为哈希表的键:
Array.from()
var groupAnagrams = function(strs) {
const map=new Map();
for(let str of strs){
let array=Array.from(str);
array.sort();
let key=array.toString();
let list=map.get(key)?map.get(key):new Array();
list.push(str);
map.set(key,list);
}
return Array.from(map.values());
};
时:O(nklogk)
,n
是strs
中的字符串的数量,k
是strs
中的字符串的最大长度。需要遍历n
个字符串,对于每个字符串,需要O(klogk)
的时间进行排序以及O(1)的时间更新哈希表。
空:O(nk)
,需要用哈希表存储全部字符串。
②计数
将每个字母出现的次数使用字符串表示,作为哈希表的键:
(对于每个字符串,可以使用长度为26
的数组记录每个字母出现的次数。)
var groupAnagrams = function(strs) {
const map=new Object();
for(let str of strs){
const count=new Array(26).fill(0);
for(let c of str){
// 不理解为什么要 -'a'.charCodeAt()
count[c.charCodeAt()-'a'.charCodeAt()]++;
}
map[count]?map[count].push(str):map[count]=[str];
}
return Object.values(map);
};
未看懂…
139. 单词拆分
523. 连续的子数组和
166. 分数到小数