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; 
	}
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

西阳未落

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值