每一位相加 进位
这一类型题都是对每一位的数相加,然后余数是相加得到的结果,商是进位;不够的补零
415. 字符串相加
class Solution {
public:
string addStrings(string num1, string num2) {
int cd=0;
int sum=0;
string ans;
int a;
int b;
for(int i=num1.size()-1,j=num2.size()-1;i>=0||j>=0;i--,j--){
a = i<0?0:num1[i]-'0';//短就补零
b = j<0?0:num2[j]-'0';
sum=a+b+cd;
ans+=sum%10+'0'; //当前位得到的结果
cd = sum/10; //进位
}
if(cd==1){ //最后一位进位
ans+='1';
}
reverse(ans.begin(),ans.end());
return ans;
}
};
67. 二进制求和
给定两个二进制字符串,返回他们的和(用二进制表示)。
输入为非空字符串且只包含数字 1 和 0。
示例 1:
输入: a = “11”, b = “1”
输出: “100”
示例 2:
输入: a = “1010”, b = “1011”
输出: “10101”
class Solution {
public:
string addBinary(string a, string b) {
int lena = a.size();
int lenb = b.size();
int jinwei = 0;
int ai;
int bi;
int sum=0;
string res="";
for(int i=lena-1, j=lenb-1;i>=0||j>=0;i--,j--){
ai = i>=0?(a[i]-'0'):0; //位数不够就给前面补零
bi = j>=0?(b[j]-'0'):0;
sum = ai+bi+jinwei;
res+=sum%2+'0'; //余数就是加过后的值
jinwei = sum/2; //大于2 就进位
}
if(jinwei==1){
res+='1';
}
reverse(res.begin(),res.end());
return res;
}
};
反转和回文
反转和回文的共同点都是while(left<right)
反转是两两交换, 回文是两两比较相不相等
125. 验证回文串
给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。
说明:本题中,我们将空字符串定义为有效的回文串。
示例 1:
输入: “A man, a plan, a canal: Panama”
输出: true
示例 2:
输入: “race a car”
输出: false
class Solution {
public:
bool isPalindrome(string s) {
int right = s.size()-1;
int left = 0;
if(s.size()==0 or s.size()==1){return true;}
while(left<right){
if((s[left]>='a'&&s[left]<='z') || (s[left]>='A'&&s[left]<='Z') || (s[left]>='0'&&s[left]<='9')){ if((s[right]>='a'&&s[right]<='z') || (s[right]>='A'&&s[right]<='Z') || (s[right]>='0'&&s[right]<='9')){
if(s[left]>='A'&&s[left]<='Z'){
s[left] = s[left]+32;
}
if(s[right]>='A'&&s[right]<='Z'){
s[right] = s[right]+32;
}
if(s[left]!=s[right]){
return false;
}
else{
left++;
right--;
}
}
else{ //right不是字母或数字
right--;
}
}
else{//left不是字母或数字
left++;
}
}
return true;
}
};
541. 反转字符串 II
给定一个字符串和一个整数 k,你需要对从字符串开头算起的每个 2k 个字符的前k个字符进行反转。如果剩余少于 k 个字符,则将剩余的所有全部反转。如果有小于 2k 但大于或等于 k 个字符,则反转前 k 个字符,并将剩余的字符保持原样。
示例:
输入: s = “abcdefg”, k = 2
输出: “bacdfeg”
要求:
该字符串只包含小写的英文字母。
给定字符串的长度和 k 在[1, 10000]范围内。
class Solution {
public:
string reverseStr(string s, int k) {
if(k>s.size()){
reverse(s.begin(),s.end());
return s;
}
for(int i=0;i<s.size();i=i+2*k){
int end = i+k-1;
if(end>s.size()){ //不够k个就把剩余的全都反转
end = s.size()-1;
}
int start = i;
while(start<end){ //反转前k个字符
char tmp = s[start];
s[start++] = s[end];
s[end--] = tmp;
}
}
return s;
}
};