编程珠玑 第二章总结

第二章主要强调了编程过程前中后,需要捕捉自己的灵感。
具体问题:
仅仅使用十几个字节的额外空间将一个n元向量x在正比于n的时间内向左旋转i个位置。

最容易想到的方法solution1:
solution1:开辟一个大小为i的内存块m,将x的前i个数放入m中,然后将x后n - i个数向左移动i位,再将m中的数填入x的最后i位中。
这样在极端情况下,要开辟n - 1个元素大小的内存块。

比较好的解法,是采用左右手翻转规则。x = ab
a(r)表示a的翻转
ab -> a(r)b(r) -> ba,异常简洁。
代码实现:

#include <iostream>
#include <vector>
using namespace std;

void reserve_v(vector<int> &v, int i, int j) {
    while(i < j) {
        swap(v[i], v[j]);
        i++;
        j--;
    }
}
int main(int argc, char *argv[]) {
    vector<int> v = {0, 13, 4, 5, 6, 2, 3, 0};
    // "i" is the count of elements moved left in circle;
    int i = 3;
    reserve_v(v, 0, i - 1);
    reserve_v(v, i, v.size() - 1);
    reserve_v(v, 0, v.size() - 1);
    for (auto i:v) {
        cout << i << " ";
    }
    cout << endl;
    return 0;
}

如果将abc->cba,如何操作?
cba = (a(r)b(r)c(r))(r),所以可以将a、b、c分别作逆序,然后在整个做逆序。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 背景 一年多以前我在知乎上答了有关LeetCode的问题, 分享了一些自己做题目的经验。 张土汪:刷leetcod...
    土汪阅读 12,779评论 0 33
  • 很多时候人都是不知足的 只有狠狠的敲打一回才能够有一会会的记性 还容易健忘 好了伤疤忘了疼的人太多了
    椰洛阅读 124评论 0 0
  • 有的人一见钟情 火热的心会燃烧掉所有激情 最终不欢而散 有的人眉开颜笑 真情言语最后让人紧锁眉头 有的人热情拥抱 ...
    马桶左便器阅读 289评论 0 1