C++基础(8)——string的相关面试题
目录
1.字符串转成整数
2.字符串相加
3.高精度加法模板(acwing)
4.验证回文串
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');//进位1reverse(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;elsereturn 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; }
};