Everyday Code : addBinary Ep.2
ความเดินตอนที่แล้ว จากการพยายามแปลงเลขฐาน 10 ไปสู่เลขฐาน 2 ( binary ) กันแล้ว ตอนนี้ก่อนที่จะไปเจอกับโจทย์ Leetcode addBinary ผมคิดว่าอีกส่วนหนึ่งที่สำคัญไม่แพ้กัน ก็คือการแปลงเลขฐาน 2 กลับไปเป็นฐาน 10 กันบ้างครับ
Problem
จงแปลงเลขฐาน 2 ( “10110” ) ให้กลายเป็นเลขฐาน 10 คำตอบของข้อนี้ก็คือ 2 + 4 + 16 = 22 นั้นเอง
เอาล่ะมาเริ่มกันเลย
ขั้นตอนที่ 1: เรารู้อะไรบ้าง ?
- มีการกำหนดให้เลข 1 แทนคำสั่ง “เลือก” และ 0 เป็นึคำสั่ง “ไม่เลือก”
- Index คือจุดกำหนดเลขยกกำลังของ Binary นับจากขวาสุดมาซ้าย
- จุดนี้ที่น่าสนใจมากคือในอีกความหมายหนึ่งของการยกกำลังคือการ Multiplier ขึ้นไปเลื่อยๆในทุกครั้ง
- ( 2 ยกกำลัง 0 = 1 ; 2 ยกกำลัง 1 = 1 x 2 ; 2 ยกกำลัง 2 = 1 x 2 x 2 ; 2 ยกกำลัง 3 = 1 x 2 x 2 x 2 )
เราจะเริ่มเห็นรูปแบบของการเริ่มที่เลขตั้งต้น ( 1 ) และทุกครั้งที่เพิ่มขึ้นไปจะมีการ คูณ 2 เข้าไป
Multiplier = 1 ; end Loop x 2 เข้าไปใน Multiplier
ขั้นตอนที่ 2 : คิดกลับ
เรารู้ว่าเราสามารถเขียน Condition IF ด้วยการใช้เลข 0 และ 1 เป็นตัวตั้งในการเลือกหรือไม่เลือก จาก binary EP.1 เราเข้าใจว่าการเลือกไม่เลือกให้ผลรวมได้ตามเป้าหมายของเรานั้น เกิดจากการที่เลขตั้งต้นจะต้องหาร 2 เพื่อแปลงค่าให้เปลี่ยนไปตามรอบในแต่ละ Loop
ถ้าเราต้องการแปลงเลขฐาน 10 เป็นฐาน 2 เราเริ่มค่าตั้งต้นด้วย 128 ( 8 byte หรือ 2⁸) แต่ถ้าเราต้องการแปลงเลขฐาน 2 เป็นฐาน 10 ละ ง่ายนิดเดียว !! กลับกันเท่านั้นเอง
เราจะเริ่มต้นด้วย 2 ^ 0 และใช้รูปแบบที่เราเจอจากขั้นตอนที่ 1 ในการอัพเดทค่ามาดูกันเลย
Let Code !
เงื่อนไข จากขั้นตอนที่ 1 ถ้าเป็น 1 เราเลือก 0 เราไม่เลือก
if(String binary == '1' ) { เก็บค่าลงใน result และบวก result เข้ากับตัวเก่าด้วย }
if(String binary == '0' ) { ไปตัวต่อไปไม่ทำอะไร }
สร้างตัวแปรจากขั้นตอนที่ 1 ทั้งคำตอบ และตัว Multiplier ด้วย
int result = 0; // ไว้เก็บคำตอบและอัพเดทคำตอบตามเงื่อนไข
int multiplier = 1; // ตั้งต้นไว้ที่ 2^0 และเพิ่มขึ้นที่ละ x 2 ไปเลื่อยๆ
เงื่อนไขการ Loop โดยปกติการ Loop เราจะเริ่มต้นจากจุดเริ่มต้นคือ 0 แต่เราจะกลับมันนิดหน่อย จากการใช้ i ในการระบุรอบ เป็น i ในการระบุตำแหน่งแทน ( ลองอ่าน Code ข้างล่างก่อนนะอาจจะเห็นภาพมากขึ้น )
String binary = "10110";
for ( i = binary.length() - 1 ; i>= 0 ; i-- )
binary.charAt(i);
- charAt() คือการบอกตำแหน่งว่าเราจะชี้ไปที่จุดใดใน String ซึ่งเราจะชี้ไปที่จุดขวาสุด ( binary.length -1 )
- นั้นก็คือจุดสุดท้าย เพราะเลข Binary จะเริ่มต้นจากขวาไปซ้าย ซึ่งแตกต่างกับเลขฐาน 10 ทั่วไป
- และจุดที่สำคัญมากๆอีกอย่างคือ i- — เพราะเราต้องการให้เลขถอยจากมากสุดไปน้อยสุด ( ขวาไปซ้าย ) นั้นเอง
เอาหล่ะเราได้ทุกอย่างครบแล้ว
ประกอบร่างง
class Solution{
int convertToBinary(String binary){
int result = 0;
int multiplier = 1;
for(int i = binary.length()-1 ; i>=0 ; i--){
if(binary.charAt(i)=='1') result = result + multiplier ;
if(binary.charAt(i)=='0') { } ; // ไม่ทำอะไรเลย
multiplier = multiplier *2 ; // ทุกครั้งที่ผ่านทุกเงื่อนไข ต้องเลื่อนไปตำแหน่งถัดไป
}
return result ;
}
}
ผลลัพธ์
ยอดเยี่ยม !! เอาหล่ะเรามาได้ถึงครึ่งทางแล้วว ในทั้งหมด 2 EP ที่ผ่านมา ผมคิดว่าเราเข้าใจหลักการแล้วหล่ะ ทั้งการเปลี่ยนกลับ และเปลี่ยนไป คร่าวนี้เราจะมาถึงส่วนใจความสำคัญกันใน EP 3 นั้นก็คือ !! การบวกเลข Binary กันครับผมม วันนี้ผมอยากจะฝาก 2 คำสุดทรงพลังไว้อย่าง Stay Curious ครับทุกคน