下面分享一下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)的學習干貨以及重要代碼的分享