记录新手小白的做题过程。
题目:
字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。比如,输入字符串"abcdefg"和数字2,该函数将返回左旋转两位得到的结果"cdefgab"。
思路:这题不用队列用什么!将字符串前k个放入队列中,删除字符串前面的k个字符,然后再在字符串后面加上队列中依次取出的元素。
关于队列(允许插入的端是队尾,允许删除的端是队头):
1.push:队列中由于是先进先出,push即在队尾插入一个元素
2.pop:将队列中最靠前位置的元素拿掉,是没有返回值的void函数
3.front:返回值为队列中的第一个元素,也就是最早、最先进入队列的元素。注意这里只是返回最早进入的元素,并没有把它剔除出队列。
4.back:返回队列中最后一个元素,也就是最晚进去的元素。
class Solution {
public:
string reverseLeftWords(string s, int n) {
queue<int> que;
int i=0;
while(i<n){//装进队列
que.push(s[i]);
i++;
}
s.erase(s.begin(),s.begin()+n);//删掉前面几个,左闭右开
while(!que.empty()){//加入字符串
s+=que.front();//从头取
que.pop();//弹出
}
return s;
}
};
其他人的代码1:
他的思路和我一样,其实我没有必要用队列,再拿一个字符串来装前n个字符,最后再拼接就好了。
class Solution {
public:
string reverseLeftWords(string str,int n){
if(str.size()==0) return str;
string s = str.substr(0,n);//主要是用到了substr函数
string res = str.substr(n,str.size()-n) + s;//后面的加前面的
return res;
}
};
其他人的代码2:
他的思路就是反转。
先反转前n个字符,后反转size-n个字符,然后再整体反转。reverse左闭右开的特性要掌握。
class Solution {
public:
string reverseLeftWords(string s, int n) {
reverse(s.begin(), s.begin() + n);
reverse(s.begin() + n, s.end());
reverse(s.begin(), s.end());
return s;
}
};
好了好了,下一题!