移情别恋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;
               else
               flag=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;
                 else
                 flag=0;
                 if(begin<=str.size()-1) 
                 str[begin]=num%10+'0';
                 else
                 str.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;
      }
      
      else
      flag++;
      }
      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;
        }
       }
       }
     
    }
    else
    break;

}
if (flag)
    return num;
else
    return -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;
    }
};

 

  • 35
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 21
    评论
评论 21
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值