12. 整数转罗马数字

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// 处理上有优先级,对于当前的数,优先处理大于1000的部分,然后处理900,500,400.....(每一部分的处理方式也有固定的对应) --> 贪心算法
string intToRoman(int num) {
string res;
vector<int> store{ 1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1 };
vector<string> strs{ "M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I" };
int n = store.size();
for (int i = 0; i < n; i++)
{
while (num >= store[i])
{
res.append(strs[i]);
num -= store[i];
}
}
return res;
}

13. 罗马数字转整数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
int romanToInt(string s) {
int res = 0;
map<char, int> hash{ {'M', 1000}, {'D', 500}, {'C', 100}, {'L', 50}, {'X', 10}, {'V', 5}, {'I', 1} };

for (int i = 0; i < s.size(); i++)
{
// s.size()为'\0',将'\0'赋给int型变量时,变量值为0;
if (hash[s[i]] < hash[s[i + 1]])
res -= hash[s[i]];
else
res += hash[s[i]];
}
cout << s[s.size()];
return res;
}

55. 跳跃游戏

在每个能到达的点检查从该点出发能到达的最远距离,最远距离超过nums.size() - 1则能到达终点

如何判断中间的某一点是否能到达?

因为是顺序遍历所有位置,每次遍历当前位置时都用maxPos检查是否能达到下一点,如果无法达到说明已经中断,此时使用break跳出循环