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]
廣告
資料結構
網路
關係資料庫管理系統
作業系統
Java
iOS
HTML
CSS
Android
Python
C 程式設計
C++
C#
MongoDB
MySQL
Javascript
PHP