344.反转字符串
编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 s
的形式给出。
不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。
class Solution {
public:
void reverseString(vector<char>& s) {
int left = 0;
int right = s.size()-1;
char temp;
while(right>=left)
{
temp = s[right];
s[right] = s[left];
s[left] = temp;
right--;
left++;
}
//库函数
//reverse(s.begin(),s.end());
}
};
541. 反转字符串II
给定一个字符串 s
和一个整数 k
,从字符串开头算起,每计数至 2k
个字符,就反转这 2k
字符中的前 k
个字符。
- 如果剩余字符少于
k
个,则将剩余字符全部反转。 - 如果剩余字符小于
2k
但大于或等于k
个,则反转前k
个字符,其余字符保持原样。
class Solution {
public:
string reverseStr(string s, int k) {
int n = 0;
while(n*2*k < s.size())
{
reverse(s.begin()+2*n*k,(s.begin()+2*n*k+k)<=s.end()?s.begin()+2*n*k+k:s.end());
n++;
}
return s;
}
};
LCR122.路径加密
假定一段路径记作字符串 path
,其中以 ".
" 作为分隔符。现需将路径加密,加密方法为将 path
中的分隔符替换为空格 "
",请返回加密后的字符串。
class Solution {
public:
string pathEncryption(string path) {
for(int i = 0;i<path.size();i++)
{
if(path[i] == '.')
{
path[i] = ' ';
}
}
return path;
}
};
151.翻转字符串里的单词
给你一个字符串 s
,请你反转字符串中 单词 的顺序。
单词 是由非空格字符组成的字符串。s
中使用至少一个空格将字符串中的 单词 分隔开。
返回 单词 顺序颠倒且 单词 之间用单个空格连接的结果字符串。
注意:输入字符串 s
中可能会存在前导空格、尾随空格或者单词间的多个空格。返回的结果字符串中,单词间应当仅用单个空格分隔,且不包含任何额外的空格。
class Solution {
public:
string reverseWords(string s) {
for(int point = s.size()-1;point>0;point--)
{
if(s[point--] == s[point] && s[point] == ' ')
s.erase(s.begin()+point);
point++;
}
int point = 0;
if(s[point] == ' ')
{
s.erase(s.begin()+0);
}
point = s.size()-1;
if(s[point] == ' ')
{
s.erase(s.begin()+point);
}
vector<string> result;
string temp;
int num = 0, count = 0;
for (int i = 0; i < s.size(); i++)
{
if (s[i] == ' ')
{
temp = s.substr(num, count);
result.push_back(temp);
num = i + 1;
count = i == 0?0:-1;
}
if (i == s.size() - 1)
{
temp = s.substr(num, count + 1);
result.push_back(temp);
}
count++;
}
string res;
for (int i = result.size() - 1; i > 0; i--)
{
res += result[i];
res += ' ';
}
res += result[0];
return res;
}
};
- erase的时间复杂度是O(n),所以使用上述erase消除空格的时间复杂度是O(n^2),如果使用双指针法,可以将时间复杂度降低至O(n)
- 上述代码方法与代码随想录不一样,时间关系今天没有看,需要另外思路详见代码随想录 (programmercarl.com)
LCR 182. 动态口令
某公司门禁密码使用动态口令技术。初始密码为字符串 password
,密码更新均遵循以下步骤:
- 设定一个正整数目标值
target
- 将
password
前target
个字符按原顺序移动至字符串末尾
请返回更新后的密码字符串。
class Solution {
public:
string dynamicPassword(string password, int target) {
/*string sub = password.substr(0,target);
password.erase(0,target);
password = password + sub;
return password;*/
reverse(password.begin(),password.begin()+target);
reverse(password.begin()+target,password.end());
reverse(password.begin(),password.end());
return password;
}
};