2022.8.20 网易笔试 长城数组 解题思路

今天考试时候脑子一团浆糊,晚上刷牙时候突然开窍,有了以下思路,如有错误还请各位大神指正!
思路:从头(两个或三个数字)开始构建长城数组,逐个添加新元素到数组内,每次添加更新需要的操作次数。
/* 第二题 长城数组

   长城数组 1 9 1 9, 2 5 2 5 2 5
   非长城数组 2 3 1 2

   给定一个数组,每次可对其中任意一数执行加1操作
   问最少几次可以把它变成长城数组
*/

#include <iostream>
#include <vector>

#define PRINT_TMP_VECTOR // 输出中间过程数组

using namespace std;

template <typename T>
const ostream& operator<< (ostream &output, const vector<T> vec) {
    for (T i : vec)
        output << i << " ";
}

/**
 * GreatWallVector: 已经确认为长城数组的数组,长度至少为3,由调用者保证。
 * n: 要新添加的数
 */
int insert2GreatWall(vector<int> &GreatWallVector, int n) {
    // 将n添加到GreatWallVector的末尾,并调整为新的GreatWallVector
    int size = GreatWallVector.size();
    if (size < 2) { // 起始数组长度需要大于等于2
        return 0;
    }

    int large, small;
    if (GreatWallVector.at(0) > GreatWallVector.at(1)) {
        large = GreatWallVector.at(0);
        small = GreatWallVector.at(1);
    } else {
        large = GreatWallVector.at(1);
        small = GreatWallVector.at(0);
    }
    
    if (GreatWallVector.at(size - 1) == large) { // 结尾元素是大值
        if (n <= small) {
            GreatWallVector.push_back(small);
            return small - n;
        } else {//if (n <= large) {
            // 与下一情况操作一致
        //} else {
            int i = size - 2, res = 0;
            while (i >= 0) {
                GreatWallVector.at(i) = n;
                res += (n - small);
                i -= 2;
            }
            GreatWallVector.push_back(n);
            return res;
        }
    } else {
        /*
        if (n <= small) {
            GreatWallVector.push_back(large);
            return large - n;
        } else */ if (n <= large) { // 与上一条件操作一致
            GreatWallVector.push_back(large);
            return large - n;
        } else {
            int i = size - 2, res = 0;
            while (i >= 0) {
                GreatWallVector.at(i) = n;
                res += (n - large);
                i -= 2;
            }
            GreatWallVector.push_back(n);
            return res;
        }
    }
}

int Conv2GreatWall(vector<int> vec) {
    int n = vec.size(), res = 0;
    if (n < 3) // n == 1 || n == 2
        return res;

    vector<int> tmp(vec.begin(), vec.begin() + 2);

    // 对前三位预处理
    int start;
    if (tmp.at(0) == tmp.at(1)) { // 如果前两位数字相同,则需要考虑第三位数字的大小
        start = 3;
        tmp.push_back(vec.at(2));
        if (tmp.at(2) == tmp.at(0)) { // 第三个数字也相同
            res += 1;
            tmp.at(1)++; // 中间的数字加1
        } else if (tmp.at(2) > tmp.at(0)) { // 第三个数字大于前两位
            res += tmp.at(2) - tmp.at(0);
            tmp.at(0) = tmp.at(2); // 操作使首位等于第三位
        } else { // 第三个数字小于前两位
            tmp.at(0)++; // 首位加1
            res += (1 + tmp.at(0) - tmp.at(2));
            tmp.at(2) = tmp.at(0); // 让第三位等于首位
        }
    } else { // 如果前两位数字不相同,则不需要考虑第三位,第三位与后面统一处理
        start = 2;
    }
    if (n > start) {
        for (int i = start; i < n; ++i) {
            res += insert2GreatWall(tmp, vec.at(i));

#ifdef PRINT_TMP_VECTOR
            cout << "Current tmp vector is : ";
            cout << tmp;
            cout << endl;
#endif

        }
    }
    return res;
}

int main() {
    while (1) {

    int n, tmp;
    vector<int> vec;
    cout << "Input the size of vector: " << endl;
    cin >> n;
    cout << "Input the vector elements: " << endl;
    while (n-- > 0) {
        cin >> tmp;
        vec.push_back(tmp);
    }
    cout << Conv2GreatWall(vec) << endl;

    }
    return 0;
}


#网易笔试##动态规划#
全部评论
分别记录奇偶数位的sum和max。然后就可以算出来了。
3 回复 分享
发布于 2022-08-21 00:34 浙江
能写这么长。。。。
点赞 回复 分享
发布于 2022-09-10 21:18 北京
想复杂了
点赞 回复 分享
发布于 2022-08-21 01:17 辽宁

相关推荐

01-01 23:23
复旦大学 Java
点赞 评论 收藏
分享
ddd7_:跟我一模一样,加微信的hr都同一个,扫码了白年书人查看图片
点赞 评论 收藏
分享
2025-12-08 07:42
门头沟学院 Java
27届末九,由于是女生,身边人几乎没有就业导向的,自学只能跟着网课,没人指导,很迷茫。下图是我目前的简历,不知道有需要修改的地方吗?求拷打。下面是目前的学习情况:目前算法过完了一遍力扣100和代码随想录,不过不是很熟,面经看了小林coding、JavaGuide,有一些没用过的技术看得不是很明白,掌握得不是很扎实。再加上常年跟黑马网课听思路,真正自己动手写代码的时间很少,这让我一直不敢投简历,总觉得内里空虚。项目没准备好面试相关的问题,简历上相应的考点不熟。如此种种。。。看到很多很多学长学姐大佬们的面经,愈发觉得面试可怕,自己没准备好,总担心自己是不是无望后端开发了。看到牛客很多同届以及更小一届的同学都找到实习了,很希望自己也能找到实习。而自己又好像摸不到后端学习的门路,只能不断赞叹黑马虎哥写的代码真优雅!微服务架构实在巧妙!消息队列、redis、sentinel、nacos、mybatisplus等等的引入都会让我赞叹这些工具的设计者的巧思,以及包括但不限于Java语言的优雅。然而只是停留在了解的程度,并不熟练。我是很希望能够继续深入探索这些知识的,只不过有一大部分时间都花在学校课程上了。我感觉我被困住了,我一方面必须保证我能够有个不错的学业分使我能有我几乎不想选择的读研退路(还有个原因是复习不全我会焦虑考试挂科,因此我会做好全面的准备,而这一步很费时间),一方面在B站学习各种网课,一方面得考虑提升自己并不扎实的算法基础,另一方面还得准备八股面经。这让我有点苦恼,我好像没那么多时间,因为绝大部分时间都花在了复习学校科目中了。我好像处处用时间,但收效甚微。想问问各位大佬是怎么平衡时间的呢?算法、项目和八股是怎么准备的呢?有什么高效的方法吗?谢谢您们花时间阅读我的稿件!
菜菜狗🐶:大胆投,我当时也是害怕面试,投多了发现根本约不到面🤡
投递哔哩哔哩等公司9个岗位
点赞 评论 收藏
分享
评论
4
4
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务