Hamming Distance Leetcode Həlli

Çətinlik səviyyəsi Asan
Tez-tez soruşulur Çiy kərpic Amazon Facebook
alqoritmlər Bit manipulyasiya Bits kodlaşdırma müsahibə müsahibə hazırlığı LeetCode LeetCodeSolutionsBaxılıb 30

Problem bəyanat

Bu problemdə bizə A və B iki tam ədədi verilir və məqsəd tapmaqdır məsafəni vurmaq verilmiş tam ədədlər arasında. Tam ədədlər ona bərabərdir / bərabərdir və daha az 231   

misal

First Integer = 5 , Second Integer = 2
3
First Integer = 4 , Second Integer = 5
1

Hamming Distance Leetcode HəlliPin

Yanaşma (Bit-bit sayma)

Çox aydın olan ilk şey budur ki, sayını tapmaq lazımdır bit verilmiş iki ədədə uyğun bit dəyərləri fərqli olduqda, verilmiş tam ədədin bit-XOR-unu etməliyik. XOR-un fərdi bit mövqeyində verəcəyi nəticələr '1' olardı bu vəziyyətdə olan iki tam ədədə bit fərqli idi. Əks təqdirdə, XOR bu vəziyyətdə '0' meydana gətirəcəkdir.

İndi bu hissəni çıxardığımız üçün, qalan tək bit bitlərin sayını səmərəli tapmaqdır. təyin etmək (bit dəyəri = '1') verilmiş tam ədədin XOR-luq hissəsində. Bu dəyəri saymaq üçün hər bit üçün döngə edirik (-dən 0 üçün 30) və XOR dəyərində qurulub-olmadığını yoxlayın.

Alqoritm

  1. İki tam ədədin bit-bit XORunu dəyişəndə ​​saxlayın - xor_
  2. Initialize CNT Nəticəni saxlamaq üçün = 0
  3. Hər biri üçün i = 0 və mən <31:
    • Əgər 'ith'bit qurulur xor_
      • Artım cnt: cnt ++ 
    • Artım i
  4. Qayıtmaq CNT

Hamming məsafəsi Leetcode həllinin tətbiqi

C ++ Proqramı

#include <bits/stdc++.h>

using namespace std;

int hammingDistance(int x , int y){
    int xor_ = x ^ y , cnt = 0;
    for(int i = 0 ; i < 31 ; i++){
        if((1 << i) & xor_)
            cnt++;
    }
    return cnt;
}

int main(){
    int x = 5 , y = 2;
    cout << hammingDistance(x , y) << endl;
    return 0;
}

Java Proqramı

class hamming_distance{

    static int hammingDistance(int x , int y){
        int xor_ = x ^ y , cnt = 0;
        for(int i = 0 ; i < 31 ; i++){
            if(((1 << i) & xor_) > 0)
                cnt++;
        }
        return cnt;
    }

    public static void main(String args[]){
        int x = 5 , y = 2;
        System.out.println(hammingDistance(x , y));
    }
}
3

Hamming məsafəsi Leetcode həllinin mürəkkəbliyinin təhlili

Zamanın mürəkkəbliyi

O (1) girişdən asılı olmayaraq sabit sayda əməliyyat həyata keçirdiyimiz üçün.

Kosmik mürəkkəblik

O (1) daimi yaddaş məkanından istifadə etdiyimiz üçün.

Yanaşma (Bitləri səmərəli saymaq - Kernighan alqoritmi)

İlk addımlar dəyişməz olaraq qalır, yəni verilmiş ədədlərin teo XOR-un bit-lə XOR-unu tapmaqdır. Bununla birlikdə, fikirlərinə əsaslanan Kernighan alqoritmindən istifadə edərək XOR-dakı set bitlərinin sayını səmərəli sayırıq:

Biz ifa etdikdə 'bitwise &'bir tam ədəd arasında əməliyyat 'i''i - 1', onun ən doğru seti yuyulmamış.

Nümunə ilə yuxarıdakı fikri izləyək. N = 36 (100100) nəzərə alın. İndi N - 1 ilə '' etsək, əldə edəcəyik:

N & (N - 1) = (36 & 35) = (100100 & 100011) = (100000) yararsızdır ən çox sağ (sağdan 2-ci vəziyyətdə). Eynilə, daha da yaza bilərik:

N & (N - 1) = (32 & 31) = (100000 & 011111) = 000000, yenidən sağ tərəfdən 5-ci mövqedəki ən çox qoyulmuş biti silir. Tam N sıfıra çevrildiyi üçün proses daha da davam etdirilə bilməz.

Bu gözəl fikir çox faydalı olduğunu sübut edir set bitləri saymaq tam olaraq, yalnız ehtiyacımız olduğu üçün təkrarlamaq kimi dəfələrlə müəyyən bit var müəyyən bir tamda.

Alqoritm

  1. İki tam ədədin bit-bit XORunu dəyişəndə ​​saxlayın - xor_
  2. Başlanğıc CNT Nəticəni saxlamaq üçün = 0
  3. Isə xor_ daha çox 0:
    1. Artım cnt: cnt ++
    2. xor_ = xor_ & (xor_ - 1) qoyun
  4. Qayıtmaq CNT

Hamming məsafəsi Leetcode həllinin tətbiqi

C ++ Proqramı

#include <bits/stdc++.h>

using namespace std;

int hammingDistance(int x , int y){
    int xor_ = x ^ y , cnt = 0;
    while(xor_ > 0){
        xor_ = (xor_ & (xor_ - 1));
        ++cnt;
    }
    return cnt;
}

int main(){
    int x = 5 , y = 2;
    cout << hammingDistance(x , y) << endl;
    return 0;
}

Java Proqramı

class hamming_distance{

    static int hammingDistance(int x , int y){
        int xor_ = x ^ y;
        int cnt = 0;
        while(xor_ > 0){
            xor_ = (xor_ & (xor_ - 1));
            ++cnt;
        }
        return cnt;
    }

    public static void main(String args[]){
        int x = 5 , y = 2;
        System.out.println(hammingDistance(x , y));
    }
}
3

Hamming məsafəsi Leetcode həllinin mürəkkəbliyinin təhlili

Zamanın mürəkkəbliyi

O (1) girişdən asılı olmayaraq sabit sayda əməliyyat həyata keçirdiyimiz üçün.

Kosmik mürəkkəblik

O (1) daimi yaddaş məkanından istifadə etdiyimiz üçün.

Şərh yaz

Translate »
1