สมมติว่ามีระเบิดที่คุณจะคลี่คลาย และเวลาของคุณกำลังจะหมดลง! คุณมีโค้ดอาร์เรย์แบบวงกลมที่มีความยาว n และมีคีย์ k ตอนนี้ในการถอดรหัสรหัส คุณต้องแทนที่ทุกหมายเลข ตัวเลขทั้งหมดจะถูกแทนที่พร้อมกัน มีกฎเล็กน้อย -
-
ถ้า k> 0 ให้แทนที่ตัวเลข ith ด้วยผลรวมของตัวเลข k ถัดไป
-
ถ้า k <0 ให้แทนที่ตัวเลข ith ด้วยผลรวมของตัวเลข k ก่อนหน้า
-
ถ้า k =0 ให้แทนที่ตัวเลข ith ด้วย 0
ในที่นี้โค้ดมีลักษณะเป็นวงกลม ดังนั้นองค์ประกอบถัดไปของโค้ด[n-1]คือโค้ด[0] และองค์ประกอบก่อนหน้าของโค้ด[0]คือโค้ด[n-1] สุดท้ายเราต้องส่งคืนรหัสที่ถอดรหัสแล้ว
ดังนั้นหากอินพุตเป็นเหมือนรหัส =[8,2,3,5], k =3 ผลลัพธ์จะเป็น [10, 16, 15, 13] เพราะสำหรับแต่ละคีย์เราจะแทนที่ด้วยผลรวมสามองค์ประกอบถัดไป ดังนั้น code[0] จะเป็น 10, code[1] จะเป็น 16, code[2] จะเป็น 15 และ code[3] จะเป็น 13
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ &mius;
-
ถอดรหัส :=รายการใหม่
-
สำหรับฉันในช่วง 0 ถึงขนาดของรหัส - 1 ทำ
-
ถ้า k> 0 แล้ว
-
ผลรวม :=0
-
เจ :=i+1
-
m :=k
-
ในขณะที่ m ไม่ใช่ศูนย์ ให้ทำ
-
sum :=sum + code[j mod ความยาวของโค้ด]
-
m :=m - 1
-
เจ :=เจ + 1
-
-
แทรกผลรวมที่ส่วนท้ายของการถอดรหัส
-
-
มิฉะนั้นเมื่อ k เท่ากับ 0 แล้ว
-
ใส่ 0 ต่อท้ายถอดรหัส
-
-
มิฉะนั้น
-
ผลรวม :=0
-
เจ :=i-1
-
m :=k
-
ในขณะที่ m ไม่ใช่ศูนย์ ให้ทำ
-
sum :=sum + code[j mod ความยาวของโค้ด]
-
m :=m + 1
-
เจ :=เจ - 1
-
-
แทรกผลรวมที่ส่วนท้ายของการถอดรหัส
-
-
-
ถอดรหัสกลับ
ตัวอย่าง (Python)
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
def dissolve(code, k):decode =[] for i in range(len(code)):if k> 0:sum =0 j =i+1 m =k while(m):sum+=code [j%len(code)] m-=1 j+=1 decode.append(sum) elif k ==0:decode.append(0) else:sum =0 j =i-1 m =k while(m) :sum+=code[j%len(code)] m+=1 j-=1 decode.append(sum) return decodecode =[8,2,3,5]k =3print(แก้(รหัส, k))ก่อน>อินพุต
[8,2,3,5], 3ผลลัพธ์
[10, 16, 15, 13]