1.字符串相乘
. - 力扣(LeetCode)
思路:
1.如果两个串有一个首元素为‘0’,则直接返回‘0’
2.设置两层循环,内层第一次循环 用于str插入初始数据
(num2 的各个元素和num1 的最后一个元素相乘的结果)
3.若存在内层第二次循环,则用num2 的各个元素和num1 的倒数第二个元素相乘
依次与str相应位置进行相加,若超出str.size(),则改用push_back进行尾插
4.最后进行reverse(str.begin(),str.end()) 倒置字符串
class Solution {
public:string multiply(string num1, string num2) {string str;int flag=0;int num=0;int begin1=0;int begin=0;if(num1[0]=='0'||num2[0]=='0'){ str='0';return str;}for(int i=num1.size()-1;i>=0;i--){ for(int j=num2.size()-1;j>=0;j--){if(i==num1.size()-1){num=(num1[i]-'0')*(num2[j]-'0')+flag;if(num>9)flag=num/10;elseflag=0;str.push_back(num%10+'0');if(j==0&&flag!=0){str.push_back(flag+'0');flag=0;}}else{num=(num1[i]-'0')*(num2[j]-'0')+flag;if(begin<=str.size()-1) num=num+str[begin]-'0';if(num>9)flag=num/10;elseflag=0;if(begin<=str.size()-1) str[begin]=num%10+'0';elsestr.push_back(num%10+'0');if(j==0&&flag!=0){str.push_back(flag+'0');flag=0;}begin++;}}begin1++;begin=begin1;}reverse(str.begin(),str.end());return str;}
};
2.反转字符串中的单词
. - 力扣(LeetCode)
思路:
1.使用迭代器string::iterator j= s.begin();取的首元素位置
2. for(;i<=s.size();i++)
如果 s[i]为‘ ’或i==s.size()
reverse(j,j+flag); //左闭右开 !!!!!!!!!!!
j=j+flag+1; //j跳过‘ ’
flag=0;
3.
else
flag++;
class Solution {
public:string reverseWords(string s) {int i=0;int flag=0;string::iterator j= s.begin();while(*j==' ')j++;for(;i<=s.size();i++){if(s[i]==' '||i==s.size()){ reverse(j,j+flag); //左闭右开j=j+flag+1;//i++;flag=0;}elseflag++;}return s;}
};
3.字符串中第一个只出现一次的字符
. - 力扣(LeetCode)
思路:
1.因为字符串中字符种类较少,可以借用计数排序的想法
2. int arr[26]={0};//一共有26个字母
3.//范围for
for(auto ch :s)
{
arr[ch-'a']++; //每出现一次该字符则在arr相应位置处++;
}
4.
for(int i=0;i<s.size();i++)
{
if(arr[s[i]-'a']==1)
{
return i; //遍历s,若arr相应处为1,则为第一个出现一次的字符
}
}
class Solution {
public:int firstUniqChar(string s) {int arr[26]={0};for(auto ch :s){arr[ch-'a']++;}for(int i=0;i<s.size();i++){if(arr[s[i]-'a']==1){return i;}}return -1;}
};
4.把字符串转为整形
. - 力扣(LeetCode)
class Solution {
public:int myAtoi(string str) {int i = 0;
int flag = 1;
int flag2=0;
long long num = 0; //pow(2,31)很大,必须用long long类型存储
while(str[i]==' ')i++; //跳过前面的‘ ’for (; i < str.size(); i++)
{if (str[i] != ' '){if (str[i] == '-'&&(str[i+1] >= '0' && str[i+1] <= '9')) //必须保证‘+’ 后必须是数字才能确定符号{if(flag2) //flag2的作用是防止“1200-12”这种类型多次读取break;flag = 0;flag2=1;}else if (str[i] == '+'&&(str[i+1] >= '0' && str[i+1] <= '9'))//同理{if(flag2)break;flag = 1;flag2=1;}else if((str[i] < '0' || str[i] > '9')) //如果为字符则直接终止循环break; if (str[i] >= '0' && str[i] <= '9'){flag2=1;num = num * 10 + str[i] - '0';if(flag){if(num>pow(2,31)-1) //判断是否越界{num=pow(2,31)-1;break;}}else{if(num>pow(2,31)){num=pow(2,31); //判断是否越界break;}}}}elsebreak;}
if (flag)return num;
elsereturn -num;}
};
5.反转字符串(错题反思)
. - 力扣(LeetCode)
官方答案:
class Solution {
public:string reverseStr(string s, int k) {int n = s.length();for (int i = 0; i < n; i += 2 * k) {reverse(s.begin() + i, s.begin() + min(i + k, n));}return s;}
};