学习目标:
- 344.反转字符串
- 541. 反转字符串II
- 卡码网:54.替换数字
- 151.翻转字符串里的单词
- 卡码网:55.右旋转字符串
学习内容:
344.反转字符串
class Solution {
public:
void mySwap(char& a, char& b){
char tmp;
tmp = a;
a = b;
b = tmp;
}
void reverseString(vector<char>& s) {
int i =0 ;
int j = s.size()-1;
for(;i < j;i++,j--){
mySwap(s[i],s[j]);
}
}
};
// 调用swap库函数版本
void reverseString(vector<char>& s) {
for (int i = 0, j = s.size() - 1; i < s.size()/2; i++, j--) {
swap(s[i],s[j]);
}
}
错误以及注意事项
- 可以直接调用库函数swap。重新写了一下以防自己并不记得库函数。
541. 反转字符串II
class Solution {
public:
void reversek(string& t, int i, int k)
{
int j = i+k-1;
for(;i<j;i++,j--)
{
swap(t[i],t[j]);
}
}
string reverseStr(string s, int k) {
for(int i = 0;i<s.size();i=i+2*k)
{
if(i+k<=s.size())
{
reversek(s,i,k);
}
else{
//剩下的全部反转
reversek(s,i,s.size()-i);
}
}
return s;
}
};
错误以及注意事项
- 在一些地方是猜测性的+1/-1,因为不太会使用debug。要抽时间把本地调试搞好来着。
//使用C++库函数reverse的版本如下
class Solution {
public:
string reverseStr(string s, int k) {
for (int i = 0; i < s.size(); i += (2 * k)) {
// 1. 每隔 2k 个字符的前 k 个字符进行反转
// 2. 剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符
if (i + k <= s.size()) {
reverse(s.begin() + i, s.begin() + i + k );
} else {
// 3. 剩余字符少于 k 个,则将剩余字符全部反转。
reverse(s.begin() + i, s.end());
}
}
return s;
}
};
卡码网:54.替换数字
题目描述:给定一个字符串 s,它包含小写字母和数字字符,请编写一个函数,将字符串中的字母字符保持不变,而将每个数字字符替换为number。 例如,对于输入字符串 “a1b2c3”,函数应该将其转换为 “anumberbnumbercnumber”。
#include<iostream>
using namespace std;
int main(){
string s;
while (cin >> s){
//统计字符串中数字的个数,添加相应的内存
int count = 0;
int sOldSize = s.size();
for(int i = 0;i<s.size();i++)
{
if(s[i]>='0' && s[i]<='9'){
count++;
}
}
//改内存!
//number有6个字符,但是因为已经原来的数字是被替换,所以只加5个就可以了
s.resize(s.size()+count*5);
int sNewSize = s.size();
//从后往前开始处理
for(int i = sNewSize-1, j = sOldSize-1; i>0 ;i--,j--){
if(s[j]<'0'||s[j]>'9')
{
s[i] = s[j];
}
else{
s[i] = 'r';
s[i-1] = 'e';
s[i-2] = 'b';
s[i-3] = 'm';
s[i-4] = 'u';
s[i-5] = 'n';
i = i-5;
}
}
}
cout << s << endl;
}
错误以及注意事项
- number有6个字符,但是因为已经原来的数字是被替换,所以只加5个就可以了
- 从后开始处理这里的条件,代码启示录写的是for (int i = sNewSize - 1, j = sOldSize - 1; j < i; i–, j–),有一点没想明白i<0还是i<=0。
151.翻转字符串里的单词
并不熟练,需要多做,这题看看抄抄搞了很久
不要使用辅助空间,空间复杂度要求为O(1)
- 去除多余空格 happy new year
- 翻转整个字符串 raey wen yppah
- 翻转单个单词 year new happy
class Solution {
public:
void reverse(string& s, int start, int end){ //翻转,区间写法:左闭右闭 []
for (int i = start, j = end; i < j; i++, j--) {
swap(s[i], s[j]);
}
}
void removeExtraSpaces(string& s)
{
// 定义快指针和慢指针
int slowIndex = 0;
int fastIndex = 0;
// 去掉字符串前面的空格
while(s.size()>0 && fastIndex<s.size() && s[fastIndex]==' ')
{
fastIndex++;
}
// 去掉字符串中间的空格
for(;fastIndex<s.size();fastIndex++)
{
//又忘记(fastIndex - 1) > 0了
if((fastIndex - 1) > 0 && s[fastIndex]==s[fastIndex-1] && s[fastIndex-1]==' ')
{
continue;
}
else{
s[slowIndex] = s[fastIndex];
slowIndex++;
}
}
//去掉最后的空格
if(slowIndex-1>0 && s[slowIndex-1]==' ')
{
s.resize(slowIndex-1);
}
else
{
s.resize(slowIndex);
}
}
string reverseWords(string s) {
//去空格
removeExtraSpaces(s);
//整体reverse
reverse(s, 0, s.size() - 1);
//单词reverse
int start = 0; //removeExtraSpaces后保证第一个单词的开始下标一定是0。
for (int i = 0; i <= s.size(); ++i) {
if (i == s.size() || s[i] == ' ') { //到达空格或者串尾,说明一个单词结束。进行翻转。
reverse(s, start, i - 1); //翻转,注意是左闭右闭 []的翻转。
start = i + 1; //更新下一个单词的开始下标start
}
}
return s;
}
};
卡码网:55.右旋转字符串
嘿嘿嘿我想起来我以前做过这道题
#include<iostream>
#include<algorithm>
using namespace std;
int main() {
int n;
string s;
cin >> n;
cin >> s;
int len = s.size(); //获取长度
reverse(s.begin(), s.end()); // 整体反转
reverse(s.begin(), s.begin() + n); // 先反转前一段,长度n
reverse(s.begin() + n, s.end()); // 再反转后一段
cout << s << endl;
}
学习时间:
2023.11.30 14:30-16:10 20:50-21:35
中间去健身房了哩~然后还跑了一下diffusion model的代码但是没跑起来。
torch里custome datasets的部分还不会,明天要搞懂,然后把代码改好,等显卡能用了就开始跑跑。
- custom datasets
- VS code C/C++ 咋一个电脑装好了另一个电脑装不好,奇了怪了。