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

码码生的 2024-08-15 17:05:02 阅读 68

1.字符串相乘

. - 力扣(LeetCode)

思路:

1.如果两个串有一个首元素为‘0’,则直接返回‘0’

2.设置两层循环,内层第一次循环 用于str插入初始数据

(num2 的各个元素和num1 的最后一个元素相乘的结果)

3.若存在内层第二次循环,则用num2 的各个元素和num1 的倒数第二个元素相乘

依次与str相应位置进行相加,若超出str.size(),则改用push_back进行尾插

4.最后进行reverse(str.begin(),str.end()) 倒置字符串

<code>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';code>

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

 

<code>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,则为第一个出现一次的字符

   }

}

<code>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)

 

<code>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)

官方答案:

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

}

};

 



声明

本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。