持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第8天,点击查看活动详情
541.反转字符串II
思路
题目讲的主要是把字符串以2*k个字符分组,==然后把每一组的前k个字符反转==,当其中有一组字符不足k个的时候,就反转该组全部的字符。 我们用
i
从0开始,每次跳跃2*k
个字符,此时的i就是每一组的起始位置,然后就进行反转就可以,==但是要注意不足k个字符的时候要全部反转。==
代码
class Solution {
public:
void swap(int l,int r,string& s)
{
while(l<r)
{
::swap(s[l],s[r]);
++l;
--r;
}
}
string reverseStr(string s, int k) {
int left;
int len=s.size();
int i;
for(i=0;i<len;i+=2*k)
{
left=i;
if(left+k-1>=len)
swap(left,len-1,s);
else
swap(left,left+k-1,s);
}
return s;
}
};
557.反转字符串中的单词III
思路
从头开始遍历字符串中的空格,同时记录首个不是空格的位置,然后进行反转字符就可以。
代码
class Solution {
public:
string reverseWords(string s) {
auto stare=s.begin();
for(auto it=s.begin();it<s.end();++it)
{
if(*it==' ')
{
reverse(stare,it);
stare=it+1;
}
}
reverse(stare,s.end());
return s;
}
};
43.字符串相乘
思路
思路就是模拟乘法的过程,乘数的每一位(从后往前)分别与被乘数的每一位(从后往前)相乘,相乘的结果放入提前开好的空间里面。该空间的大小为两个字符串的长度。 细节 当其中一个字符串为0的时候,直接返回0 乘的结果是从开辟空间的最后一个开始的。对于乘好的数,要进行判断是否要进位。进位:大于10,进/10,原数变成%10。 最后把乘好的结果添加到字符串中,要从第一个非0数开始插入。最后要释放开辟的空间。
代码
class Solution {
public:
string multiply(string num1, string num2) {
if(num1[0]=='0'||num2[0]=='0')
return "0";
int len1 = num1.size(), len2 = num2.size();
int* arr = new int[len1 + len2]{ 0 };
for (int i = len1-1; i >=0; --i)
{
for (int j =len2-1; j >=0; --j)
{
arr[i + j+1] += (num1[i] - '0') * (num2[j] - '0');
if (arr[i + j+1] > 9)
{
arr[i + j ] += arr[i + j+1] / 10;
arr[i + j+1] = arr[i + j+1] % 10;
}
}
}
string ret;
int len = 0;
for (int i = 0; i < len1+len2;++i)
{
if (arr[i] != 0)
{
len = i;
break;
}
}
for (int i = len; i<len1+len2; ++i)
{
ret += arr[i] + '0';
}
delete[] arr;
return ret;
}
};