下面分享一下string做题心得
1. 明白字符串中存储的数字为'0' '8' '9'与0 8 9 完全不同,字符'0'其实在串中存储的是48,要有意识的转化。字符串中如果存数字8,意味着存了BS(退格)
例如1: 算出结果为5,存入使用s+=(5+'0')
例如2:读取数据 int num1 = s[i]-'0'
2. 要熟练运用 s+= 或者 reserve(s1.begin() ,s1.end())或者是s1 = s2与s1.assign(s2)作用相同。
3. 遇到不熟悉的接口一定要去查一查。
下面为ascii表
后面分享了3道oj题
43. 字符串相乘
检验是否是回文串
字符串转整形字符
检验是否是回文串第一题答案
class Solution {
public:
string addStrings(string num1, string num2)
{
int carry=0;
string s3;
int end1=num1.size()-1;
int end2=num2.size()-1;
while(end1>=0 ||end2>=0)
{
int x1 = end1 >= 0 ? num1[end1--]-'0' : 0;
int x2 = end2 >= 0 ? num2[end2--]-'0' : 0;
int end=x1+x2+carry;
carry=end/10;
end=end%10;
s3+=(end+'0');
}
if(carry==1)
{
s3+='1';
}
reverse(s3.begin(),s3.end());
return s3;
}
string multiply(string num1, string num2)
{
string return_string("0");
if(num1.size()==1&&num1[0]=='0'
||num2.size()==1&&num2[0]=='0')
return return_string;
int end1 = num1.size() - 1;
int end2 = num2.size() - 1;
int carry = 0;
int count[num2.size()+2];
int num = 0;
for (int i = 1; i <= num2.size(); ++i)
{
string s;
int t=i;
while(t>1)
{
s+='0';
--t;
}
int numend1 = end1;
while (numend1 >= 0)
{
int x1 = num1[numend1--] - '0';
int x2 = num2[end2] - '0';
int end = x1 * x2 + carry;
carry = end / 10;
end = end % 10;
s += (end+'0');
}
if (carry > 0)
{
s += (carry+'0');
carry=0;
}
end2--;
reverse(s.begin(), s.end());
string s3= addStrings(s,return_string);
return_string.assign(s3);
}
return return_string;
}
};
第二题答案
class Solution {
public:
bool ischar(char x)
{
if(x>='0'&&x<='9'
||x>='A'&&x<='Z'
||x>='a'&&x<='z')
{
return true;
}
return false;
}
bool isPalindrome(string s)
{
for(auto& e:s)
{
if(e>='A'&&e<='Z')
{
e+=32;
}
}
int begin=0;
int end=s.size()-1;
while(begin<end)
{
while(begin<end && !ischar(s[begin]))
{++begin;}
while(begin<end && !ischar(s[end]))
{--end;}
if(s[begin]!= s[end])
{
return false;
}
else
{
++begin;
--end;
}
}
return true;
}
};
第三题答案
class Solution {
public:
int myAtoi(string str)
{
bool sign = true; //默认为正数
// 跳过开头可能存在的空格
int i = 0;
while(i < str.size() && str[i] == ' ')
{
i++;
}
//接着判断首个字符是否为正负号
if(str[i] == '-')
{
sign = false; // 该字符串为负数,移至下一个字符接着判断
i++;
}
else if(str[i] == '+') // 字符串为正数,sign已经默认为true,直接移动到下一位即可
i++;
//下面开始对非正负符号位进行判断
if(str[i] < '0' || str[i] > '9') // 正常数字第一位不能是0,必须为1~9之间的数字,否则就是非法数字
return 0;
int res = 0; //这里res用的int型,需要更加仔细考虑边界情况,但如果用long的话可以省去一些麻烦
int num = 0;
int border = INT_MAX / 10; // 用来验证计算结果是否溢出int范围的数据
while(i < str.size())
{
// 遇到非数字字符,则返回已经计算的res结果
if(str[i] < '0' || str[i] > '9')
break;
// 注意这句话要放在字符转换前,因为需要验证的位数比实际值的位数要少一位, 这里比较巧妙的地方在于
// 1. 用低于int型数据长度一位的数据border判断了超过int型数据长度的值
// 2. 将超过最大值和低于最小值的情况都包括了
if(res > border || res == border && str[i] > '7')
return sign == true ? INT_MAX : INT_MIN;
//开始对数字字符进行转换
num = str[i] - '0';
res = res * 10 + num;
i++;
}
//最后结果根据符号添加正负号
return sign == true ? res : -res;
}
};
看到这里啦,你应该已经有了不少收获了
这个博客如果对你有帮助,给博主一个免费的点赞就是最大的帮助❤
欢迎各位点赞,收藏和关注哦❤
如果有疑问或有不同见解,欢迎在评论区留言哦❤
后续我会一直分享双一流211西北大学软件(C,数据结构,C++,Linux,MySQL)的学习干货以及重要代码的分享