您的位置:首页 > 文旅 > 旅游 > 移情别恋c++ ദ്ദി˶ー̀֊ー́ ) ——5.string

移情别恋c++ ദ്ദി˶ー̀֊ー́ ) ——5.string

2025/2/26 19:06:58 来源:https://blog.csdn.net/2301_80374809/article/details/141130837  浏览:    关键词:移情别恋c++ ദ്ദി˶ー̀֊ー́ ) ——5.string

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

 

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com