LeetCode刷题——旋转数组
程序员文章站
2022-04-28 18:30:28
...
大家好,我终于刷完了字符串的题,向数组迈进。做的第一道数组题很简单,来看下题目:
使用复杂度为O(1)的原地算法的意思就是不要开辟新的空间,这里定义新的变量是没有关系的,但是注意不能使用new,malloc这类的开辟空间操作,例如不能定义新的vector数组,因为它包含了隐式的new,delete操作。
思路如下:
定义一个中间变量temp,让它等于数组的最后一位元素,并插入到数组的第一位,然后删除掉数组的最后一位。循环k次。
代码如下:
class Solution {
public:
void rotate(vector<int>& nums, int k) {
int temp;
for (int i = 1;i <= k;i++){
int len = nums.size();
temp = nums[len - 1];
nums.insert(nums.begin(),temp);
nums.erase(nums.end() - 1);
}
}
};
通过本题主要想记录的两点:
1.nums.end()表示的是数组最后一位的后一位,我在刚开始做题的时候没有设置减一,一直报错,做了这么多题还犯这种错误,实在不应该。
2.在自己的vs调试的时候,我一般会写一个main函数方便调试,那么问题来了,如何输入vector数组,我试了很多方法,都不太有用。最后采用的是C++Primer Plus中提供的一种方法,直接把代码贴出来:
#include <iostream>
#include <string>
#include <vector>
using namespace std;
void main()
{
int k;
cin >> k;
string t;
vector<int> nums;
cin >> t;
int len = t.size();
for(int j = 0;j < len;j++){
nums.push_back(t[j] - '0');
}
int temp;
for (int i = 1;i <= k;i++){
int len = nums.size();
temp = nums[len - 1];
nums.insert(nums.begin(),temp);
nums.erase(nums.end() - 1);
}
system("pause");
}
希望对大家有帮助,我们下期见。