class Solution {
public:
string addStrings(string num1, string num2) {
//字符串相加,用双指针法,分别指向两个字符串的末尾
int i,j;
//用来拼接字符串
string ans="";
int length1=num1.length();
int length2=num2.length();
i=length1-1;
j=length2-1;
//add 用来看是否需要进行进位
int add=0;
//while循环来进行从后往前的遍历
while(i>=0||j>=0||add!=0){
int x=0,y=0;
//这里的if else 循环主要解决的问题就是如果都是一位的话,比如1+9 要进行进位i 和j都是-1了num[-1]会产生越界的错误
if(i>=0){
x=num1[i]-'0';
}else{
x=0;
}
if(j>=0){
y=num2[j]-'0';
}else{
y=0;
}
int res=x+y+add;
add=res/10;
int digit=res%10;
// cout<<digit<<endl;
ans.push_back(digit+'0');
i--;
j--;
}
reverse(ans.begin(),ans.end());
return ans;
}
};
class Solution {
public:
vector<vector<int>> generate(int numRows) {
//vector<vector<int >> 是一个多维向量
//res(numRows) 就是给res开辟了numRows个空间
vector<vector<int>> res(numRows);
for(int i=0;i<numRows;i++){
//给第i行开辟空间 numRows个空间
res[i].resize(i+1);
//每一行的头和尾都是1
res[i][0]=res[i][i]=1;
for(int j=1;j<i;j++){
res[i][j]=res[i-1][j-1]+res[i-1][j];
}
}
return res;
}
};
class Solution {
public:
int aa(char a){
switch(a){
case'I': return 1; break;
case'V': return 5; break;
case'X': return 10; break;
case'L': return 50; break;
case'C': return 100; break;
case'D': return 500; break;
case'M': return 1000; break;
}
return 0;
}
int romanToInt(string s) {
int sum=0;
for(int i=0;i<s.length();i++){
int number1=aa(s[i]);
cout<<"number1="<<number1<<endl;
int number2=aa(s[i+1]);
cout<<"number2="<<number2<<endl;
if(number1<number2){
number1=-number1;
}
sum=sum+number1;
}
return sum;
}
};
有点不明白为啥s[i+1],这块不会数组越界
class Solution {
public:
string longestCommonPrefix(vector<string>& strs) {
//初始化最长公共前缀为空
string res;
if(strs.empty()){
return "";
}else{
//如果字符串不是空则把第一个子串当成前缀串
res=strs[0];
}
for(int i=0;i<strs.size();i++){
//find返回的是子串起始的位置,如果返回的不是零,证明不是前缀,就一直减直到是前缀为止
while(strs[i].find(res)!=0){
res=res.substr(0,res.length()-1);
}
}
return res;
}
};
class Solution {
public:
bool isValid(string s) {
//使用哈希表来判断是否匹配
map<char,int> mp={{'(',1},{'{',2},{'[',3},{')',4},{'}',5},{']',6}};
stack<int> st;
bool istrue=true;
int flag;
//然后遍历字符串,看是否匹配
for(int i=0;i<s.length();i++){
flag=mp[s[i]];
if(flag>=1&&flag<=3){
st.push(s[i]);
}else if((st.empty()!=true)&&mp[st.top()]==flag-3){
//如果出栈的栈顶元素的flag-3和刚刚的flag相同就出栈
st.pop();
}else{
istrue=false;
break;
}
}
if(st.empty()!=true){
istrue=false;
}
return istrue;
}
};
//注意st.empty()的返回值是true 和false 不是0 和1
//map 的操作相当于一个二维数组
//map<char,int> mp;
//初始化 mp={{'c'1,}}
// 访问的时候mp[c]=1
class Solution {
public:
vector<int> plusOne(vector<int>& digits) {
int length=digits.size();
for(int i=length-1;i>=0;i--){
if(digits[i]==9){
digits[i]=0;
}else{
digits[i]++;
return digits;
}
}
//如果都加到头了,还是要进位就给前面补1
digits.insert(digits.begin(),1);
return digits;
}
};