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.