X-i Y-ə çevirmək üçün minimum əməliyyatlar

Çətinlik səviyyəsi Mühit
Tez-tez soruşulur Amazon Məlumat dəsti Fanatics Fourkites JP Morgan Mintra Samsung Spotify kvadrat
Genişlik İlk Axtarış QrafikBaxılıb 95

Sistem dizaynı ilə bağlı müsahibə sualları o qədər açıq ola bilər ki, düzgün hazırlaşmağı bilmək çox çətindir. İndi satın aldıqdan sonra Amazon, Microsoft və Adobe-nin dizayn dövrlərini sındıra bilirəm Bu kitabı. Gündəlik bir yenidən nəzərdən keçirin dizayn sualı və söz verirəm ki, dizayn dövrünü sındıra bilərsiniz.

Problem bəyanat

“X-i Y-yə çevirmək üçün minimum əməliyyatlar” problemi sizə iki ədəd X və Y verildiyini bildirir, aşağıdakı əməliyyatlardan istifadə edərək X-i Y-ə çevirmək lazımdır:

Başlanğıc nömrəsi X-dir və aşağıdakı əməliyyatlar X-də və aralıq nəticə olaraq yaranan nömrələrdə aparıla bilər.

  1. ədədi 2-yə vurun.
  2. sayını 1 azaldır.

Yuxarıda göstərilən əməliyyatlardan istifadə edərək X-i Y-ə çevirmək üçün lazım olan minimum addım sayını öyrənin.

Məhdudiyyətlər: 0 <X, Y <1000

misal

X = 3, Y = 11
3

Izahat: 3 * 2 = 6, 6 * 2 = 12, 12-1 = 11 3 addım

X = 2, Y = 10
5

Explanation: 2 * 2 = 4, 4-1 = 3, 3 * 2 = 6, 6-1 = 5, 5 * 2 = 10 -> 5 addım

Yanaşma

Tətbiq edirik BFS əsaslı alqoritm. Sonra 2 əməliyyatı yerinə yetirə bilərik ya da 2-yə vururuq, ya da 1-i çıxardırıq. Bu şəkildə başlanğıc X sayından və verilmiş iki əməliyyatı yerinə yetirərək yarana biləcək bütün rəqəmlərə çata bilərik. Hər hansı bir yaradılan nömrə Y nömrəsinə bərabərdirsə əldə edilir. Beləliklə, sadəcə Y sayını yaratmaq üçün atılan addımların sayını qaytarırıq. Rəqəmlər yaradan zaman aşağıdakı məqamları nəzərə almaq vacibdir:

  1. Yaradılan nömrə məhdudiyyətləri təmin etmirsə, nömrənin BFS növbəsinə daxil edilməsinə məhəl qoymuruq.
  2. Hal-hazırda yaradılan nömrə əvvəllər yaradılıbsa. Sadəcə BFS növbəsinə əlavə etmədən nömrəni görməməzlikdən gəlirik. Bu günə qədər yaradılan nömrələri izləmək üçün bir hash seti istifadə olunur.
  3. Əməliyyat sayını izləyirik (adlı dəyişəndə) səviyyə) tələb olunan əməliyyatları həyata keçirərək X nömrəsindən başlanğıc sayından bir ədəd yaratmaq üçün yerinə yetirilmişdir.

X-i Y-ə çevirmək üçün Minimum Əməliyyatları tapmaq üçün alqoritm

  1. Bir yaradın queue BFS keçidi üçün X başlanğıc nömrəsini daxil edin və növbə səviyyəsindədir. X-in X-ə çevrilməsi üçün tələb olunan əməliyyatların sayı 0 olduğu üçün başlanğıc sayının səviyyəsi 0-dır.
  2. Bir yaradın HashSet indiyə qədər yaradılan nömrələri saxlayan.
  3. Sonra BFS keçidinə başlayın.
  4. Düyün dəyəri Y giriş nömrəsinə bərabərdirsə, növbədən bir qovşaq açın. Və bu düyünün qayıtma səviyyəsi (X-dən minimum əməliyyat sayı).
  5. Başqa bir halda, bu düyünü hash qrupumuza əlavə edin (ziyarət edildiyi kimi qeyd edin).
  6. İndi atılan düyün dəyərini 2 ilə vurun və dəstdə olub olmadığını yoxlayın.
  7. Bu qədər yaradılan rəqəm çoxluqda yoxdursa. Beləliklə, nömrəni səviyyə ilə birlikdə növbəyə daxil edin (yaradılan bu düyünün səviyyəsi = atılmış (ana) düyün səviyyəsi + 1).
  8. Atılan düyün dəyərini 1-ə endirin və dəstdə olub olmadığını yoxlayın.
  9. Bu qədər yaradılan rəqəm çoxluqda yoxdursa. Beləliklə, nömrəni səviyyə ilə birlikdə növbəyə daxil edin (yaradılan bu düyünün səviyyəsi = atılmış (ana) düyün səviyyəsi + 1).
  10. Geri qayıtma vəziyyəti ilə qarşılaşana qədər 3-9 addımlarını təkrarlayın addım-4.

Alqoritm aşağıda təsvir edilmişdir:

X-i Y-ə çevirmək üçün minimum əməliyyatlar

Kodu

X-yə çevirmək üçün minimum əməliyyatları tapmaq üçün C ++ kodu

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

/* class definition to treat 
numbers generated as nodes */
class Node
{
    public:
    int num;
    int level;
    
    Node(int num,int level)
    {
        this->num = num;
        this->level = level;
    }
};

/* function to find minimum number of 
operations required to convert x into y */
int minOperation(int x,int y)
{
    queue<Node*> q;
    unordered_set <int> us;
    
    Node *node = new Node(x,0);
    q.push(node);
    
    while(!q.empty())
    {
        Node *top = q.front();
        q.pop();
        
        if(top->num == y)
        return top->level;
        
        us.insert(top->num);
        
        /* Multiplication Operation */
        if(us.find(2*top->num) == us.end())
        {
            Node *temp = new Node(2*top->num,top->level+1);
            q.push(temp);
        }
        
        /* Subtraction Operation */
        if(us.find(top->num-1) == us.end() && top->num-1 > 0)
        {
            Node *temp = new Node(top->num-1,top->level+1);
            q.push(temp);
        }
    }
}
/* Main function */
int main()
{
    int x = 2,y = 10;
    cout<<minOperation(x,y)<<endl;
    
    return 0;
}
5

X-i Y-ə çevirmək üçün Minimum Əməliyyatları tapmaq üçün Java Kodu

import java.util.*;
import java.io.*;

class TutorialCup 
{
    /* class definition to treat 
    numbers generated as nodes */
    static class Node
    {
        int num;
        int level;
        
        Node(int num,int level)
        {
            this.num = num;
            this.level = level;
        }
    }
    
    /* function to find minimum number of 
    operations required to convert x into y */
    static int minOperation(int x,int y)
    {
        Queue <Node> q = new LinkedList<>();
        HashSet <Integer> hs = new HashSet<Integer>();
        
        Node node = new Node(x,0);
        q.add(node);
        
        while(!q.isEmpty())
        {
            Node top = q.poll();
            
            if(top.num == y)
            return top.level;
            
            hs.add(top.num);
            
            /* Multiplication Operation */
            if(!hs.contains(2*top.num))
            {
                Node temp = new Node(2*top.num,top.level+1);
                q.add(temp);
            }
            
            /* Subtraction Operation */
            if(!hs.contains(top.num-1) && top.num-1 > 0)
            {
                Node temp = new Node(top.num-1,top.level+1);
                q.add(temp);
            }
        }
        
        return 0;
    }
    /* Main function */
  public static void main (String[] args) 
  {
      int x = 2,y = 10;
        System.out.println(minOperation(x,y));
  }
}
5

Mürəkkəblik təhlili

Zamanın mürəkkəbliyi

Yuxarıdakı yanaşmadan istifadə edərək bir nömrə tapmaq üçün zamanın mürəkkəbliyini şərh etmək çətindir. Ancaq hələ də ən pis zaman mürəkkəbliyini şərh edə bilərik. Ən pis vəziyyətdə nə ola bilər, məhdudiyyət altında olan bütün rəqəmlərdən keçirik. Bütün nömrələrdən keçsək də, lazımi sayımızı tapa bilmirik. Beləliklə zamanın mürəkkəbliyi O (N), burada N verilmiş məhdudiyyətlər altında mümkün olan ən böyük elementdir.

Kosmik Mürəkkəblik

Kosmik mürəkkəbliyi də şərh etmək çətindir. Ancaq zamanın mürəkkəbliyi ilə etdiyimizə bənzəyir. Beləliklə, kosmik mürəkkəblik üçün də eyni. Ən pis vəziyyətdə, bütün elementləri növbəyə əlavə edəcəyik. Bu alqoritmi götürməyə məcbur edir O (N) boşluq, burada N verilən məhdudiyyət altında mümkün olan ən böyük rəqəmdir.

Crack Sistemi Dizayn Müsahibələri
Translate »