1.替换空格
解法1:STL
有已有的函数还是很舒服的,没什么好说的
class Solution {
public:
string replaceSpace(string s) {
for(int i=0;i<s.size();i++)
{
if(s[i]==' ') //有时候用惯了python,注意这里只能用单引号,C++里不一样的
{
s.replace(i,1, "%20");//这句话的意思从i位置开始的第一个字符进行替换
}
}
return s;
}
};
解法2:正常写法
创建一个新的数组 用这个新的函数遍历s字符串,如果遇到空格就添加3个新字符(%20) 把这个数组变成字符串
class Solution {
public:
string replaceSpace(string s) {
string s1(3*s.size(),0);//别忘了设置新字符串的大小
int j=0;
for(int i=0;i<s.size();i++)
{
if(s[i]!=' ')
{
s1[j++]=s[i];
}
else{//最好一个个写进去
s1[j++]='%';
s1[j++]='2';
s1[j++]='0';
}
}
return s1;
}
};
其实也可以
for(int i=0;i<s.size();i++)
{
if(s[i]==' '){
a+="%20";
}else{
a+=s[i];
}
}
用 += 的话会频繁进行字符数组空间开辟和拷贝,每次都会产生一个新的String对象。s1(3*s.size(),0)直接给他分配一个需要的内存,虽然可能会占用多点内存,还是这样好点
解法3:python偷懒
s.replace(" ", "%20")//haha,这是不是作弊
2.第一个只出现一次的字符
解法1:哈希法
小tip: for(char &c:str ), ### 法 1 for(char c:str ) ###法2 中遍历都可以,但法2会复制一个s字符串再进行遍历操作,法1直接引用原字符串进行遍历操作.法1用起来会更优,在内存or时间上
class Solution {
public:
int FirstNotRepeatingChar(string str) {
unordered_map<char, int> mp;//建立哈希
for(char &c:str )//先遍历一边所有字符,并统计出现次数
mp[c]++;
for(int i=0;i<str.size();i++)//因返回的是位置,所以要用i遍历
{
if(mp[str[i]]==1)
return i;
}
return -1;
}
};
3.左旋转字符串
解法1:暴力破解
2个循环分别遍历从n开始和0-n部分
class Solution {
public:
string LeftRotateString(string str, int n) {
if (n > str.size()) return str;
string string2="" ;
for(int i=0;i<(str.size()-n);i++){//从n开始的部分
string2[i] = str[i+n];
}
for(int i=0;i<n;i++)//n之前的部分
string2[str.size()-n+i] = str[i];
return string2;
}
};
解法2:采用标准库
形式 : s.substr(pos, len) 返回值: string,包含s中从pos开始的len个字符的拷贝(pos的默认值是0,len的默认值是s.size() - pos)
class Solution {
public:
string LeftRotateString(string str, int n) {
if(str.empty()) return str;
string string2;
int j = str.size();
n=n%j; //应对移位大于字符串长度这种情况
string2 = str.substr(n)+str.substr(0,n);
return string2;
}
};
|