移情别恋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;
}
};
上一篇: 【Python】已解决:UnicodeEncodeError: ‘ascii’ codec can’t encode characters in position 0-1: ordinal not i
本文标签
声明
本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。