344.反转字符串
编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 char[] 的形式给出。
不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。
你可以假设数组中的所有字符都是 ASCII 码表中的可打印字符。
思路:可以直接调用reverse函数,这里我们可以将字符串看做数组,每一个字有下标,那这样就很简单了,双指针直接上;
class Solution {
public:
void reverseString(vector<char>& s) {
int start = 0;
int end = s.size() - 1;
while(start < end){
char temp = s[start];
s[start] = s[end];
s[end] = temp;
start++;
end--;
}
}
};
541. 反转字符串II
给定一个字符串 s 和一个整数 k,从字符串开头算起, 每计数至 2k 个字符,就反转这 2k 个字符中的前 k 个字符。
如果剩余字符少于 k 个,则将剩余字符全部反转。
如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样。
示例:
输入: s = "abcdefg", k = 2
输出: "bacdfeg"
思路:这一题是要翻转每2k个字符串中的前k个字符,若剩余的字符串数小于k则剩余字符全部翻转,若大衣等于k但小于2k,则将剩余字符串全部翻转。遍历字符串过程中,索引下标每次递增2k就好,在判断是否有反转区间。我这里思考的是,定义两个指针,start和end,start表示每次遍历是的起点,而end取i+k-1和n-1的较小者,n这里指的是字符串长度,这里就是用来剩余的字符数的大小是否小于k,若小于k,取i+k-1;等于k说明明恰好剩了k个字符。
class Solution {
public:
string reverseStr(string s, int k) {
int n = s.length();
for(int i = 0; i < n; i += 2*k){
int start = i;
int end = min(i + k - 1,n - 1);
while(start < end){
swap(s[start],s[end]);
start++;
end--;
}
}
return s;
}
};
题目:剑指Offer 05.替换空格
请实现一个函数,把字符串 s 中的每个空格替换成"%20"。
示例 1: 输入:s = "We are happy."
输出:"We%20are%20happy."
思路:这里我想到的是一个偷懒的办法,就是遍历字符串s,发现空格,直接插入%20,这个办法leetcode上无法成功;
class Solution {
public:
string replaceSpace(string s) {
string result;
for (char c : s) {
if (c == ' ') {
result += "%20";
}
else {
result += c;
}
}
return result;
}
};
LCR 122.路径加密
假定一段路径记作字符串 path
,其中以 ".
" 作为分隔符。现需将路径加密,加密方法为将 path
中的分隔符替换为空格 "
",请返回加密后的字符串。
class Solution {
public:
string pathEncryption(string path) {
string kobe;
int left = 0;
int right = 0;
while(right < path.length()){
if(path[right] == '.'){
kobe += path.substr(left,right - left) + ' ';
left = right + 1;
}
right++;
}
//处理最后一个分隔符之后的部分
if(left < path.length()){
kobe += path.substr(left,path.length() - left);
}
return kobe;
}
};
LCR 182.动态口令
某公司门禁密码使用动态口令技术。初始密码为字符串 password
,密码更新均遵循以下步骤:
- 设定一个正整数目标值
target
- 将
password
前target
个字符按原顺序移动至字符串末尾
请返回更新后的密码字符串。
思路:其实题意就是要把前target个字符左移target位。
class Solution {
public:
string dynamicPassword(string password, int target) {
reverse(password.begin(),password.begin() + target);
reverse(password.begin() + target,password.end());
reverse(password.begin(),password.end());
return password;
}
};