自学内容网 自学内容网

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');//进位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; 
}
};


原文地址:https://blog.csdn.net/2301_80065652/article/details/142708882

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!