สมมติว่าเรามีรายการจำนวนเต็มบวก จำนวนเต็มที่อยู่ติดกันจะทำการหารแบบทศนิยม ตัวอย่างเช่น [2,3,4] -> 2 / 3 / 4 ตอนนี้ เราสามารถเพิ่มวงเล็บในตำแหน่งใดก็ได้เพื่อเปลี่ยนลำดับความสำคัญของการดำเนินการเหล่านี้ เราควรหาวิธีเพิ่มวงเล็บเพื่อให้ได้ผลลัพธ์สูงสุด เราต้องหานิพจน์ที่เกี่ยวข้องในรูปแบบสตริง นิพจน์ของเราไม่ควรมีวงเล็บซ้ำซ้อน ดังนั้นหากอินพุตเป็น [1000,100,10,2] ผลลัพธ์จะเป็น “1000/(100/10/2)”
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
- n :=ขนาดของอาร์เรย์ nums
- ถ้า n เป็น 0 ให้คืนค่าสตริงว่าง
- num :=nums[0] เป็นสตริง
- ถ้า n เป็น 1 ให้คืนค่า num
- ถ้า n เป็น 2 ให้คืนค่า num concatenate /, concatenate nums[1] เป็นสตริง
- den :=สตริงว่าง
- สำหรับ i ในช่วง 1 ถึง n – 1
- den :=den + nums[i] เป็นสตริง
- ถ้าฉันไม่ใช่ n – 1 แล้ว den :=den concatenate ‘/’
- ส่งคืน num concatenate / concatenate ( concatenate den , concatenate )
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
ตัวอย่าง
#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
string optimalDivision(vector<int>& nums) {
int n = nums.size();
if(n == 0) return "";
string num = to_string(nums[0]);
if(n == 1) return num;
if(n == 2) return num + "/" + to_string(nums[1]);
string den = "";
for(int i = 1; i < n; i++){
den += to_string(nums[i]);
if(i != n - 1) den += "/";
}
return num + "/" + "(" + den + ")";
}
};
main(){
vector<int> v = {1000,100,10,2};
Solution ob;
cout << (ob.optimalDivision(v));
} อินพุต
[1000,100,10,2]
ผลลัพธ์
1000/(100/10/2)