สมมติว่าเรามีตัวเลข s ในรูปแบบเลขฐานสอง เราต้องหาจำนวนขั้นตอนเพื่อลดให้เป็น 1 ภายใต้กฎเหล่านี้ -
-
หากจำนวนปัจจุบันเป็นเลขคู่ เราต้องหารด้วย 2
-
หากตัวเลขปัจจุบันเป็นเลขคี่ คุณต้องบวก 1 เข้าไป
ดังนั้น หากอินพุตเป็นเหมือน "1101" ผลลัพธ์จะเป็น 6 เนื่องจาก "1101" เป็น 13 ดังนั้น 13 เป็นเลขคี่ บวก 1 และรับ 14 จากนั้น 14 จะเป็นเลขคู่ หารด้วย 2 และรับ 7 หลังจาก 7 เป็นเลขคี่ บวก 1 และรับ 8
จากนั้น 8 ก็เหมือนเดิม หารด้วย 2 ได้ 4 อีกครั้ง 4 เป็นเลขคู่ หารด้วย 2 ได้ 2 สุดท้าย 2 เป็นเลขคู่ หารด้วย 2 ได้ 1
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
-
กำหนดฟังก์ชัน addStrings() ซึ่งจะใช้อาร์เรย์ num1 อาร์เรย์ num2
-
กำหนดอาร์เรย์ ret
-
พก :=0, ผลรวม :=0
-
ย้อนกลับ num1 และ num2
-
ผม :=0, j :=0
-
ในขณะที่ (i <ขนาดของ num1 หรือ j <ขนาดของ num2) ทำ −
-
ถ้าฉัน <ขนาดของ num1 และ j <ขนาดของ num2 แล้ว −
-
sum :=carry + (num1[i] + num2[j])
-
ใส่ sum mod 2 ที่ท้าย ret
-
พก :=ผลรวม / 2
-
(เพิ่ม i ขึ้น 1)
-
(เพิ่มขึ้น j โดย 1)
-
-
มิฉะนั้นเมื่อฉัน <ขนาดของ num1 แล้ว−
-
sum :=carry + (num1[i])
-
ใส่ sum mod 2 ที่ท้าย ret
-
พก :=ผลรวม / 2
-
(เพิ่ม i ขึ้น 1)
-
-
มิฉะนั้น
-
sum :=carry + (num2[j])
-
ใส่ sum mod 2 ที่ท้าย ret
-
พก :=ผลรวม / 2
-
(เพิ่มขึ้น j โดย 1)
-
-
-
หากการพกพาไม่ใช่ศูนย์ ดังนั้น −
-
ใส่ carry ที่ส่วนท้ายของ ret
-
-
i :=ขนาดของ ret
-
ตอบ :=สตริงว่าง
-
สำหรับ i>=0, ปรับปรุง (ลด i โดย 1) ทำ -
-
ans :=ans + (ret[i] + ASCII ของ '0')
-
-
return (ถ้าขนาดของ ans เท่ากับ 0 ให้ป้อน "0" มิฉะนั้น ans)
-
กำหนดฟังก์ชัน addBinary() ซึ่งจะรับอาร์เรย์ a, อาร์เรย์ b
-
ส่งคืน addStrings(a, b)
-
กำหนดอาร์เรย์ makeVector และคัดลอกจาก v
-
กำหนดอาร์เรย์ ret
-
สำหรับการเริ่มต้น i :=0 เมื่อ i <ขนาด v อัปเดต (เพิ่ม i ขึ้น 1) ทำ -
-
แทรก v[i] - ASCII ของ '0' ที่ส่วนท้ายของ ret
-
-
รีเทิร์น
-
-
จากวิธีหลักให้ทำดังนี้
-
ยกเลิก :=0
-
กำหนดอาร์เรย์ x =makeVector จาก s
-
ในขณะที่ขนาดของ x> 1 ทำ −
-
(เพิ่มการถอยกลับโดย 1)
-
ถ้าองค์ประกอบสุดท้ายของ x เหมือนกับ 0 แล้ว −
-
ลบองค์ประกอบสุดท้ายออกจาก x
-
-
มิฉะนั้น
-
กำหนดอุณหภูมิอาร์เรย์ขนาด 1
-
อุณหภูมิ[0] :=1
-
x :=makeVector(addBinary(x, temp))
-
-
-
รีเทิร์น
ตัวอย่าง
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
#include <bits/stdc++.h> using namespace std; class Solution { public: string addStrings(vector<int> num1, vector<int> num2){ vector<int> ret; int carry = 0; int sum = 0; reverse(num1.begin(), num1.end()); reverse(num2.begin(), num2.end()); int i = 0; int j = 0; while (i < num1.size() || j < num2.size()) { if (i < num1.size() && j < num2.size()) { sum = carry + (num1[i]) + (num2[j]); ret.push_back(sum % 2); carry = sum / 2; i++; j++; } else if (i < num1.size()) { sum = carry + (num1[i]); ret.push_back(sum % 2); carry = sum / 2; i++; } else { sum = carry + (num2[j]); ret.push_back(sum % 2); carry = sum / 2; j++; } } if (carry) ret.push_back(carry); i = ret.size() - 1; string ans = ""; for (; i >= 0; i--) ans += (ret[i] + '0'); return ans.size() == 0 ? "0" : ans; } string addBinary(vector<int>& a, vector<int>& b){ return addStrings(a, b); } vector<int> makeVector(string v){ vector<int> ret; for (int i = 0; i < v.size(); i++) ret.push_back(v[i] - '0'); return ret; } int numSteps(string s){ int ret = 0; vector<int> x = makeVector(s); while (x.size() > 1) { ret++; if (x.back() == 0) { x.pop_back(); } else { vector<int> temp(1); temp[0] = 1; x = makeVector(addBinary(x, temp)); } } return ret; } }; main(){ Solution ob; cout << (ob.numSteps("1101")); }
อินพุต
"1101"
ผลลัพธ์
6