原题链接:12. 整数转罗马数字 - 力扣(LeetCode)

这其实是个暴力算法,但是简单易懂,可以看看,不难,秒了
class Solution {
public:
string intToRoman(int num) {
string qian[]={"","M","MM","MMM"};
string bai[]={"","C","CC","CCC","CD","D","DC","DCC","DCCC","CM"};
string shi[]={"","X","XX","XXX","XL","L","LX","LXX","LXXX","XC"};
string ge[]={"","I","II","III","IV","V","VI","VII","VIII","IX"};
int num1=num/1000;
int num2=(num%1000)/100;
int num3=(num%100)/10;
int num4=num%10;
string result=qian[num1]+bai[num2]+shi[num3]+ge[num4];
return result;
}
};
原题链接:13. 罗马数字转整数 - 力扣(LeetCode)

这题跟刚刚那题相反,不过也不难,使用unordered_map直接秒了
class Solution {
public:
int romanToInt(string s) {
unordered_map<char,int> map={//创造一个无序map容器,这个很好用,推荐各位学C++的朋友学习
{'I',1},
{'V',5},
{'X',10},
{'L',50},
{'C',100},
{'D',500},
{'M',1000}
};
int result=0;
int n=s.length();
for(int i=0;i<n;i++){
if(i+1<n&&map[s[i]]<map[s[i+1]]){
result-=map[s[i]];//按照规则,如果小于后者要减去
}
else{
result+=map[s[i]];
}
}
return result;
}
};
原题链接:14. 最长公共前缀 - 力扣(LeetCode)

class Solution {
public:
string longestCommonPrefix(vector<string>& strs) {
if(strs.empty()) return "";//如果为空则返回空
for(int i=0;i<strs[0].size();i++){//直接以第一个字符串为基准开始比较,简单粗暴
char c=strs[0][i];
for(int j=1;j<strs.size();j++){
if(i>=strs[j].size()||strs[j][i]!=c){
return strs[0].substr(0,i);//如果某个字符串长度不够,或者字符不匹配,就返回已匹配的部分
}
}
}
return strs[0];//如果第一个字符串和其他的字符串前缀重合,则输出第一个字符串
}
};

class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums) {
vector<vector<int>> result;//容器里边放容器
int n=nums.size();
if(n<3) return result;//数据数量小于3,直接返回空
sort(nums.begin(),nums.end());//对数据进行排序
for(int i=0;i<n-2;i++){
if(i>0 && nums[i]==nums[i-1]) continue;
int left=i+1;//以i为基准,找到另外两个符合条件的数据
int right=n-1;
while(left<right){
int sum=nums[i]+nums[left]+nums[right];//计算总和
if(sum<0){//总和小了,就找更大的
left++;
}else if(sum>0){//总和大看,就找更小的
right--;
}else{//符合条件就装进容器
result.push_back({nums[i],nums[left],nums[right]});
while(left<right && nums[left]==nums[left+1]) left++;//避免重复
while(left<right && nums[right]==nums[right-1]) right--;
left++;//继续匹配
right--;
}
}
}
return result;
}
};