目录
1.字符串转成整数
题目:将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数。数值为0或者字符串不是一个合法的数值则返回0。输入的字符串包括数字字母符号,可以为空。
例子:
输入:"+2147483647"
输出:“2147483647”
思路:
分两步进行:1.先判断除第一个字符以外的其他字符,若不满足题意,则返回0,若满足则进行计算;2.最后判断第一个字符,若还是字符则进行计算并返回,若是正负号则加正负号返回,若都不是则返回0;
代码:
class Solution {
public:
int StrToInt(string str) {
if (str.size() == 0)
return 0;
int start = 0;
int end = str.size() - 1;
int ret = 0;
int i = 1;
while (start < end)
{
if (str[end] < '0' || str[end] > '9')
{
return 0;
}
ret += i*(str[end] - '0');
i *= 10;
end--;
}
if (str[end] >= '0' && str[end] <= '9')
return ret + i*(str[end] - '0');
if (str[end] == '+')
return ret;
if (str[end] == '-')
return -ret;
return 0;
}
};
2.字符串相加
题目:
给定两个字符串形式的非负整数num1和num2,计算它们的和。
示例 1:
输入:num1 = "11", num2 = "123" 输出:"134"
示例 2:
输入:num1 = "456", num2 = "77" 输出:"533"
示例 3:
输入:num1 = "0", num2 = "0" 输出:"0"
思路:用高精度加法来模拟我们平常计算加法,将字符串逆置,设置进位来处理。
class Solution {
public:
string addStrings(string A, string B) {
if (A.size() < B.size()) return addStrings(B, A);
reverse(A.begin(),A.end());//逆置用来模拟实现加法计算
reverse(B.begin(),B.end());//逆置用来模拟实现加法计算
string ret;//存储
int t=0;
for (int i = 0; i<A.size(); i ++ )
{
t += A[i]-'0';
if (i <B.size()) t += B[i]-'0';
ret.push_back(t % 10+'0');
t /= 10;
}
if (t) ret.push_back(t+'0');//进位1
reverse(ret.begin(),ret.end());//逆置返回
return ret;
}
};
3.高精度加法模板(acwing)
// C = A + B, A >= 0, B >= 0
vector<int> add(vector<int> &A, vector<int> &B)
{
if (A.size() < B.size()) return add(B, A);
vector<int> C;
int t = 0;
for (int i = 0; i < A.size(); i ++ )
{
t += A[i];
if (i < B.size()) t += B[i];
C.push_back(t % 10);
t /= 10;
}
if (t) C.push_back(t);
return C;
}
4.验证回文串
题目:给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。
示例:
输入:“A man, a plan, a canal: Panama”
输出:true
思路:
基本思路就是双指针的思路,由于要忽略字母的大小写,我们可以先将大写字母转换成小写字母,再进行双指针算法,并再++,--的过程中跳过一些无关的字符,直到左右指针相遇。
class Solution {
public:
bool check(char ch)
{
if ((ch >= 'a' && ch <= 'z')
|| (ch >= '0' && ch <= '9'))
return true;
else
return false;
}
bool isPalindrome(string s) {
for (auto& ch : s)
{
if (ch >= 'A' && ch <= 'Z')
ch += 32;
}
int begin = 0, end = s.size() - 1;
while (begin < end) //当还有字母未判断时,循环继续
{
while (begin < end && !isLetterOrNumber(s[begin])) begin++;
while (begin < end && !isLetterOrNumber(s[end])) end--;
if (s[begin] == s[end])
{
begin++;
end--;
}
else return false;
}
return true;
}
};