189. 旋转数组
思路1:使用辅助数组
class Solution {
public:
void rotate(vector<int>& nums, int k) {
vector<int> res(nums.size(),0);//辅助数组
for(int i = 0;i<nums.size();i++){
res[(k+i)%nums.size()] = nums[i];//这个地方卡了好久,请一定画图理解
}
for(int i = 0;i<nums.size();i++){
nums[i]=res[i];
}
}
};
思路2:翻转数组
/*
nums = “----->–>”; k =3 // 后移3位
result = “–>----->”; // 要求的结果
reverse “----->–>” we can get “<–<-----” // 首先全部翻转
reverse “<–” we can get “–><-----” // 仅翻转前半部分
reverse “<-----” we can get “–>----->” // 然后翻转后半部分
this visualization help me figure it out 😃 // 形象化的方法帮你搞清楚
*/
class Solution {
public:
void reverse(vector<int>& nums,int l,int r){
while(l<r){
swap(nums[l++],nums[r--]);
}
}
void rotate(vector<int>& nums, int k) {
k%=nums.size();
reverse(nums,0,nums.size()-1);
reverse(nums,0,k-1);
reverse(nums,k,nums.size()-1);
}
};
这道题目在字符串里其实很常见,我把字符串反转相关的题目列一下:
字符串:力扣541.反转字符串II
字符串:力扣151.翻转字符串里的单词
字符串:剑指Offer58-II.左旋转字符串
本题其实和字符串:剑指Offer58-II.左旋转字符串就非常像了,剑指offer上左旋转,本题是右旋转。
在字符串:剑指Offer58-II.左旋转字符串中,我们提到,如下步骤就可以左旋转字符串:
/*
nums = “–>----->”; k =3 // 左移3位
result = “----->–>”; // 要求的结果
reverse “–>” we can get “<–” // 仅翻转前半部分
reverse “----->” we can get “<-----” // 然后翻转后半部分
reverse “<–<-----” we can get “----->–>” // 全部翻转
this visualization help me figure it out 😃 // 形象化的方法帮你搞清楚
*/
反转区间为前n的子串
反转区间为n到末尾的子串
反转整个字符串
本题是右旋转,其实就是反转的顺序改动一下,优先反转整个字符串,步骤如下:
反转整个字符串
反转区间为前k的子串
反转区间为k到末尾的子串
【不改动也可以,搞清楚位置就好】
/*
nums = “–>----->”; k =3 // 左移3位
result = “----->–>”; // 要求的结果
reverse"–>----->"we can get’’<-----<–’’// 全部翻转
reverse “<-----” we can get “----->” // 然后翻转前半部分 【注意】0,s.size()-n-1
reverse “<–” we can get “–>” // 翻转后半部分 【注意】s.size()-n,s.size()-1
*/
class Solution {
public:
string reverse(string &s,int l ,int r){
while(l<r){
swap(s[l],s[r]);
l++;r--;
}
return s;
}
string reverseLeftWords(string s, int n) {
n = n%s.size();
reverse(s,0,s.size()-1);
reverse(s,0,s.size()-n-1);
reverse(s,s.size()-n,s.size()-1);
return s;
}
};
思路3.环状替代
详细思路
有点list的感觉,复习list的时候再回来看看这题