Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

ลบหนึ่ง Bit จากเลขไบนารี เพื่อให้ได้ค่าสูงสุด ใน C++

อภิปรายปัญหาที่เราได้รับเลขไบนารี เราต้องลบ bit หนึ่งออกจากมัน เพื่อให้ตัวเลขที่เหลือควรเป็นค่าสูงสุดของตัวเลือกอื่นๆ ตัวอย่างเช่น:

Input : N = 1011
Output: 111
คำอธิบาย: เราต้องลบ bit หนึ่ง ดังนั้นการลบ bit 0 จะให้ตัวเลขสูงสุดมากกว่าการลบ bit 1 ใดๆ 111 > 101, 011

Input: 111
Output: 11
คำอธิบาย: เนื่องจากทุก bit เป็น 1 ดังนั้นเราสามารถลบ bit ใดๆ ได้

วิธีการหาคำตอบ

วิธี Brute-Force

การนำ Brute force ไปใช้จะให้ตัวเลขผลลัพธ์สูงสุด คือ โดยการลบแต่ละ bit ทีละตัว เปรียบเทียบผลลัพธ์ที่แตกต่างกัน และได้ผลลัพธ์สูงสุด

แต่มี วิธีที่มีประสิทธิภาพ (Efficient approach) หนึ่งที่สามารถใช้ได้ คือ ถ้าเราลบ bit ที่ซ้ำกันน้อยที่สุด (least redundant bit)

วิธีที่มีประสิทธิภาพ (Efficient Approach)

วิธีที่มีประสิทธิภาพจะส่งผลต่อตัวเลขผลลัพธ์น้อยที่สุด

  • ก่อนอื่น เดินทางผ่าน bit จากด้านขวา
  • ค้นหา 0 และข้ามมันในครั้งแรกที่พบ
  • ถ้าไม่พบ 0 ให้ลบ bit ใดๆ หนึ่งตัว

ตัวอย่าง

โค้ด C++ สำหรับวิธีที่มีประสิทธิภาพ

#include <bits/stdc++.h>
using namespace std;

int main(){
    string str = "1011";
    bool flag = false;
    int n = str.length();
    // เริ่มต้นอาร์เรย์ใหม่สำหรับ
    char res[n - 1];
    int j = 0;
    // เดินทางผ่านเลขไบนารีจากขวา
    for (int i = 0; j < n - 1; i++) {
        // ถ้าพบ 0 ให้ข้ามมัน
        if (str[i] == '0' && flag == false) {
            flag = true;
            continue;
        }
        else
            res[j++] = str[i];
    }
    // พิมพ์สตริงผลลัพธ์
    cout << "Maximum number: " << res;
    return 0;
}

ผลลัพธ์

Maximum number: 111

คำอธิบายโค้ด

  • ตัวแปร flag ใช้เพื่อให้ลบ 0 เพียงตัวเดียวเท่านั้น
  • อาร์เรย์ตัวอักษร res ถูกเริ่มต้นเพื่อเก็บตัวเลขผลลัพธ์
  • ลูปจะทำงานจนถึง n-1 เพราะเราต้องเก็บองค์ประกอบน้อยกว่าตัวเลขเดิมหนึ่งตัว

สรุป

ในบทช่วยสอนนี้ เราอภิปรายการหาตัวเลขสูงสุดหลังจากลบหนึ่ง bit ออกจากมัน เราอภิปรายสองวิธีในการแก้ปัญหานี้

เรายังเขียนโค้ด C++ สำหรับปัญหานี้ ซึ่งเราสามารถเขียนในภาษาอื่นๆ เช่น C, Java, Python ฯลฯ ได้ เราหวังว่าบทช่วยสอนนี้จะเป็นประโยชน์