C++ 中的数组转换


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

  • 如果一个元素小于其左右两个相邻元素,则该元素加 1。

  • 如果一个元素大于其左右两个相邻元素,则该元素减 1。

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

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

要解决此问题,我们将遵循以下步骤:

  • 如果数组大小为 2 或小于 2,则返回数组
  • 设置 flag := true
  • 当 flag 为 true 时:
    • 设置 flag := false
    • 创建一个名为 temp 的空数组,并将 arr[0] 插入到 temp 中
    • 对于 i 从 1 到数组大小 – 1
      • 如果 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 插入到 temp 中,并将 flag 设置为 true
      • 否则将 arr[i] 插入到 temp 中
    • 将 arr 的最后一个元素插入到 temp 中
    • arr := temp
  • 返回 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]

更新于: 2020-04-28

510 次浏览

开启你的 职业生涯

通过完成课程获得认证

开始学习
广告

© . All rights reserved.