โจทย์
เริ่มต้นด้วย n หาก n เป็นเลขคู่ ให้นำ n หารด้วย 2 หาก n เป็นเลขคี่ ให้นำ n คูณ 3 แล้วบวก 1 ทำซ้ำขั้นตอนนี้ไปเรื่อย ๆ จนกว่าค่าจะเป็น 1 ให้รวมทั้งค่าตั้งต้นและ 1 สุดท้ายไว้ในคำตอบด้วย
ให้เขียนฟังก์ชัน collatz_sequence(n)
อินพุต
n: จำนวนเต็มบวกที่ใช้เริ่มต้น
เอาต์พุต
คืนค่าลำดับทั้งหมดตามลำดับที่เกิดขึ้น
เงื่อนไข
1 ≤ n ≤ 10,000 อินพุตในช่วงนี้จะถึง 1 ตามกฎนี้เสมอ และค่าทุกตัวในลำดับจะอยู่ในช่วงของ signed 64-bit integer
ตัวอย่าง
อินพุต:
n = 6
ผลลัพธ์ที่คาดหวัง:
expected = [6, 3, 10, 5, 16, 8, 4, 2, 1]
อินพุต:
long long n = 6;
ผลลัพธ์ที่คาดหวัง:
std::vector<long long> expected = {6, 3, 10, 5, 16, 8, 4, 2, 1};
อินพุต:
long n = 6;
ผลลัพธ์ที่คาดหวัง:
long[] expected = new long[] {6, 3, 10, 5, 16, 8, 4, 2, 1};
คำอธิบาย
6 เป็นเลขคู่ จึงกลายเป็น 3 จากนั้น 3 กลายเป็น 10 ทำตามกฎนี้ต่อไปเรื่อย ๆ จนถึง 1
อินพุต:
n = 1
ผลลัพธ์ที่คาดหวัง:
expected = [1]
อินพุต:
long long n = 1;
ผลลัพธ์ที่คาดหวัง:
std::vector<long long> expected = {1};
อินพุต:
long n = 1;
ผลลัพธ์ที่คาดหวัง:
long[] expected = new long[] {1};
คำอธิบาย
ค่าตั้งต้นคือ 1 อยู่แล้ว จึงไม่ต้องแปลงค่าใด ๆ
แนวทางการแก้
ลองทำเองก่อน แล้วค่อยเปิดคำใบ้ทีละข้อ
คำใบ้ 1
ลำดับนี้สร้างโดยใช้กฎเดียวซ้ำ ๆ ตามว่าเลขปัจจุบันเป็นคู่หรือคี่
คำใบ้ 2
ต่อค่าถัดไปเข้าไปเรื่อย ๆ จนกว่าจะถึง 1
คำใบ้ 3
อย่าลืมว่า ทั้งค่าเริ่มต้นและ 1 ตัวสุดท้ายต้องอยู่ในผลลัพธ์ด้วย
ความซับซ้อนที่คาดหวัง
O(k) time, O(k) extra space, where k is the sequence length
แหล่งอ้างอิง
โจทย์นี้ปรับให้เหมาะกับ CodeUtility กรุณาทำตามคำชี้แจงและข้อจำกัดด้านบน