Computer >> Máy Tính >  >> Lập trình >> C ++

Chuyển đổi mảng trong C ++


Giả sử có một mảng ban đầu là arr, hãy xem xét mỗi ngày chúng ta sản xuất một mảng mới bằng cách sử dụng mảng của ngày hôm trước. Vào ngày thứ i, chúng ta sẽ thực hiện các phép toán sau trên mảng của ngày thứ i-1 để tạo ra mảng của ngày thứ i. Các điều kiện như sau -

  • Nếu một phần tử nhỏ hơn cả giá trị liền kề bên trái và bên phải của nó, thì phần tử này sẽ được tăng lên.

  • Nếu một phần tử lớn hơn cả giá trị liền kề bên trái và bên phải của nó, thì phần tử này sẽ bị giảm.

  • Các phần tử đầu tiên và cuối cùng sẽ được giữ nguyên.

Sau một số ngày, mảng không thay đổi nữa. tìm mảng cuối cùng đó. Vì vậy, nếu mảng ban đầu là [6,2,3,4] thì đầu ra là [6,3,3,4]. Vào ngày đầu tiên, mảng sẽ được thay đổi từ [6,2,3,4] thành [6,3,3,4], sau đó sẽ không thực hiện thêm thao tác nào nữa.

Để giải quyết vấn đề này, chúng tôi sẽ làm theo các bước sau -

  • nếu kích thước mảng là 2 hoặc nhỏ hơn 2, thì trả về mảng
  • đặt cờ:=true
  • trong khi cờ là true -
    • đặt cờ:=false
    • tạo một mảng trống được gọi là tạm thời và chèn arr [0] vào tạm thời
    • cho tôi trong phạm vi từ 1 đến kích thước mảng - 1
      • nếu arr [i]
      • ngược lại khi arr [i]> arr [i - 1] và arr [i]> arr [i + 1], thì chèn arr [i] - 1 vào tạm thời và đặt cờ:=true
      • nếu không, hãy chèn arr [i] vào tạm thời
    • chèn phần tử cuối cùng của arr vào tạm thời
    • arr:=temp
  • return arr

Ví dụ (C ++)

Hãy cùng chúng tôi xem cách triển khai sau để hiểu rõ hơn -

#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));
}

Đầu vào

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

Đầu ra

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