LeetCode刷题——旋转数组

大家好,我终于刷完了字符串的题,向数组迈进。做的第一道数组题很简单,来看下题目:


使用复杂度为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");
}
希望对大家有帮助,我们下期见。



猜你喜欢

转载自blog.csdn.net/miss_yuki/article/details/80221752