下面分享一下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)的学习干货以及重要代码的分享