C ++中的数组转换

假设有一个初始数组arr,请考虑每天我们使用前一天的数组生成一个新数组。在第i天,我们将对第i-1天的数组执行以下操作,以生成第i天的数组。条件如下-

  • 如果一个元素小于其左侧和右侧相邻值,则此元素递增。

  • 如果一个元素大于其左侧和右侧相邻值,则该元素将递减。

  • 第一个和最后一个元素将保持不变。

几天后,数组不再更改。找到那个最终数组。因此,如果初始数组为[6,2,3,4],则输出为[6,3,3,4]。在第一天,数组将从[6,2,3,4]更改为[6,3,3,4],然后将不再执行任何操作。

为了解决这个问题,我们将遵循以下步骤-

  • 如果数组大小为2或小于2,则返回数组

  • 设置标志:= true

  • 而标志为真-

    • 如果arr [i] <arr [i-1]和arr [i] <arr [i + 1],则将arr [i] + 1插入temp,并将flag设置为true

    • 否则,当arr [i]> arr [i-1]且arr [i]> arr [i + 1]时,则在温度中插入arr [i] – 1,并设置标志:= true

    • 否则将arr [i]插入temp

    • 设置标志:=假

    • 创建一个名为temp的空数组,并将arr [0]插入temp

    • 对于范围从1到数组大小的i – 1

    • 将arr的最后一个元素插入temp

    • arr:=临时

    • 返回arr

    例子(C ++)

    让我们看下面的实现以更好地理解-

    #include <bits/stdc++.h>
    using namespace std;
    #define push push_back
    void print_vector(vector<auto> v){
       cout << "[";
       for(int i = 0; i<v.size(); i++){
          cout << v[i] << ", ";
       }
       cout << "]"<<endl;
    }
    class Solution {
    public:
       vector<int> transformArray(vector<int>& arr) {
          if(arr.size()<=2)return arr;
          bool flag = true;
          while(flag){
             flag = false;
             vector <int> temp;
             temp.push_back(arr[0]);
             for(int i = 1; i < arr.size()-1; i++){
                if(arr[i]< arr[i-1] && arr[i]<arr[i+1]){
                   temp.push(arr[i]+1);
                   flag = true;
                }
                else if(arr[i]> arr[i-1] && arr[i]>arr[i+1]){
                   flag = true;
                   temp.push(arr[i]-1);
                }
                else temp.push(arr[i]);
             }
             temp.push_back(arr[arr.size()-1]);
             arr = temp;
          }
          return arr;
       }
    };
    main(){
       Solution ob;
       vector<int> v = {1,6,3,4,3,5};
       print_vector(ob.transformArray(v));
    }

    输入值

    [1,6,3,4,3,5]

    输出结果

    [1,4,4,4,4,5]