1.整数转罗马数字
罗马数字包含以下七种字符:I, V, X, L, C, D和M
字符 | 数值 |
I | 1 |
V | 5 |
X | 10 |
L | 50 |
C | 100 |
D | 500 |
M | 1000 |
思路:先把数字反转,然后处理反转的数字
string intToRoman(int num) {
vector<int> v = {1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1};
vector<string> c = {"M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I"};
string res = "";
for(int i = 0; i < v.size(); i++)
{
int times = num / v[i];
for(int j = 0; j < times; j++)
{
res += c[i];
}
num = num % v[i];
}
return res;
}
2.三数之和
给定一个包含n个整数的数组nums,判断nums中是否存在三个元素a,b,c,使得a+b+c=0?找到所有满足条件且不重复的三元组。
思路:将数组排序,从开头元素开始遍历,将三数之和转化为两数之和问题。利用双指针,注意超时问题。
vector<vector<int>> threeSum(vector<int>& nums) {
set< vector<int> > s;
vector< vector<int> > res;
sort(nums.begin(), nums.end());
for(int i = 0; i < nums.size(); i++)
{
if(nums[i] > 0)
{
break;
}
if(i > 0 && nums[i] == nums[i - 1])
{
continue;
}
int target = -nums[i];
int j = i + 1;
int k = nums.size() - 1;
while(j < k)
{
if(nums[j] + nums[k] == target)
{
vector<int> temp;
temp.push_back(nums[i]);
temp.push_back(nums[j]);
temp.push_back(nums[k]);
s.insert(temp);
while(j < k && nums[j] == nums[j + 1])
{
j++;
}
while(j < k && nums[k] == nums[k - 1])
{
k--;
}
j++;
k--;
}
else if(nums[j] + nums[k] < target)
{
j++;
}
else if(nums[j] + nums[k] > target)
{
k--;
}
}
}
for(set< vector<int> >::iterator it = s.begin(); it != s.end(); it++)
{
res.push_back(*it);
}
return res;
}