大家好,我终于刷完了字符串的题,向数组迈进。做的第一道数组题很简单,来看下题目:
使用复杂度为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"); }希望对大家有帮助,我们下期见。