โจทย์
แพตเทิร์น decorator เพิ่มพฤติกรรมโดยการห่ออ็อบเจ็กต์เป็นชั้น ๆ แต่ละชั้นที่นี่จะเปลี่ยนราคาของชั้นที่อยู่ข้างใน
เริ่มจาก base_price และใช้ตัวตกแต่งตามลำดับ:
discount p: ลดราคาลง p เปอร์เซ็นต์.tax p: เพิ่มราคาขึ้น p เปอร์เซ็นต์.shipping a: บวกจำนวนคงที่ a.coupon a: ลบ a แต่ต้องไม่ต่ำกว่า 0.
Implement price_decorators(base_price, decorators).
ข้อมูลนำเข้า
base_price: The starting price.
decorators: The layers, in the order they wrap the price. Amounts may have decimals.
ผลลัพธ์
Return the final price. Answers within 1e-6 are accepted.
เงื่อนไข
0 ≤ base_price ≤ 1,000,000
0 ≤ จำนวน decorator ≤ 100; 0 ≤ p ≤ 100, 0 ≤ a ≤ 100,000
ตัวอย่าง
อินพุต:
base_price = 100
decorators = ["discount 10", "tax 8", "shipping 5"]
ผลลัพธ์ที่คาดหวัง:
expected = 102.2
อินพุต:
long long base_price = 100;
std::vector<std::string> decorators = {"discount 10", "tax 8", "shipping 5"};
ผลลัพธ์ที่คาดหวัง:
double expected = 102.2;
อินพุต:
long base_price = 100;
string[] decorators = new string[] {"discount 10", "tax 8", "shipping 5"};
ผลลัพธ์ที่คาดหวัง:
double expected = 102.2;
คำอธิบาย
100 − 10% = 90 บวกภาษี 8% = 97.2 บวกค่าส่ง 5 = 102.2
อินพุต:
base_price = 20
decorators = ["coupon 25", "shipping 4"]
ผลลัพธ์ที่คาดหวัง:
expected = 4.0
อินพุต:
long long base_price = 20;
std::vector<std::string> decorators = {"coupon 25", "shipping 4"};
ผลลัพธ์ที่คาดหวัง:
double expected = 4.0;
อินพุต:
long base_price = 20;
string[] decorators = new string[] {"coupon 25", "shipping 4"};
ผลลัพธ์ที่คาดหวัง:
double expected = 4.0;
คำอธิบาย
คูปองจะทำให้ราคาต่ำกว่าศูนย์ ราคาจึงหยุดที่ 0 แล้วค่าส่งทำให้เป็น 4
แนวทางการแก้
ลองทำเองก่อน แล้วค่อยเปิดคำใบ้ทีละข้อ
คำใบ้ 1
ใช้ชั้นต่าง ๆ ตามลำดับที่ให้มาเท่านั้น
คำใบ้ 2
เปอร์เซ็นต์คิดจากราคาปัจจุบัน ไม่ใช่ราคาตั้งต้น
คำใบ้ 3
คูปองไม่มีทางทำให้ราคาต่ำกว่า 0
ความซับซ้อนที่คาดหวัง
เวลา O(จำนวน decorator), หน่วยความจำเพิ่ม O(1)
แหล่งอ้างอิง
โจทย์นี้ปรับให้เหมาะกับ CodeUtility กรุณาทำตามคำชี้แจงและข้อจำกัดด้านบน