Verilmiş bir sətirdən 'b' və 'ac' silin


SimBaxılıb 660

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.

Bir simli nəzərə alsaq, simldəki bütün “b” və “ac” ları aradan qaldırmaq üçün bir funksiya yazın

QEYD : ipdən yalnız bir dəfə keçməliyik və əlavə yerə icazə verilmir

Metod 1

Bu metodda 'ac' -ı yalnız 'a' və 'c' ardıcıl olduqda çıxaracağıq

misal

GİRİŞ:
s = "abcabc"

Çıxış:
"Acac"

Bu metodda əsas fikir iki vəziyyət maşını istifadə etməkdir, cari xarakterə əvvəlki simvol 'a' olarsa, vəziyyət İKİ, əks halda vəziyyət BİRDİR

Alqoritm

Verilən sətirdən i dəyişənlə keçin və j dəyişənindən istifadə edərək 'b' və 'ac' xaricində simvol əlavə edin.

1. Vəziyyət BİRdirsə və cari simvol 'a' və ya 'b' olduqda, cari işarəni çıxarma sətrinə köçürməyin, çünki 'b' silməyimiz lazımdır və növbəti simvol 'c' ola bilməz.

2. Vəziyyət İKİ və cari xarakter 'c' deyilsə, əvvəlki işarəni əlavə edin (yəni 'a' dan başqa heç bir şey). Sonra cari xarakteri yoxlayırıq, əgər cari xarakter 'b' deyilsə 'a' deyilsə, onu çıxışı sətrə kopyalayırıq.

yəni, s = “abc” simli üçün tətbiq,

addım 1 : i = 0 ('a'), vəziyyət = BİR, j = 0
Yalnız vəziyyəti İKİ olaraq dəyişdirin

addım 2 : i = 1 ('b'), vəziyyət = İKİ, j = 0
Əvvəlki işarəni, yəni s [j] = 'a' əlavə edin, j-ni 1-ə artırın
Cari char 'b' dir, buna görə əlavə etmə və vəziyyəti ONE olaraq dəyişdirmə

addım 3 : i = 2 ('c'), vəziyyət = BİR, j = 1
Yalnız mövcud xarakteri əlavə edin, yəni s [j] = s [i]
Çap et []

C ++ Proqramı

#include <iostream>
using namespace std;
#define ONE 1
#define TWO 2
 
// The main function that removes occurences of "a" and "bc"
// in input string
void removeBAndAC(char *s)
{
    //Starting the state will be ONE
    int state = ONE;
 
    //variable for storing chars in output string
    int j = 0;
 
    for (int i = 0; s[i] != '\0'; i++)
    {
        //state is ONE and char is neither a or b, then copy char to output
        if (state == ONE && s[i] != 'a' && s[i] != 'b')
        {
            s[j] = s[i];
            j++;
        }
        //state is TWO and char in not c
        if (state == TWO && s[i] != 'c')
        {
            s[j] = 'a';
            j++;
            //state is TWO and char is neither a or b, then copy char to output    
            if (s[i] != 'a' && s[i] != 'b')
            {
                s[j] = s[i];
                j++;
            }
        }
 
        // Change state according to current character
        state = (s[i] == 'a')? TWO: ONE;
    }
 
    // If last character was 'a', copy it to output
    if (state == TWO)
    {
        s[j] = 'a';
        j++;
    }
 
    // Set the string terminator
    s[j] = '\0';
}
 

int main()
{
    char s1[] = "abcabc";
    removeBAndAC(s1);
    cout << s1 << endl;
 
    char s2[] = "acbac";
    removeBAndAC(s2);
    cout << s2 << endl;
 
    return 0;
}

Yoxla

Metod 2

Bu metod, Metod 1 ilə eynidir, lakin burada çıxış 'b' və 'ac' ehtiva etməyəcəkdir. yəni aşağıda göstərilən nümunədə b və ac çıxarıldıqdan sonra simli “acac” olur, bu sətirdə ac var, ona görə də acları çıxarın

misal

GİRİŞ:
s = "abcabc"

Çıxış:
””

Alqoritm

Alqoritm Metod 1 ilə eynidir, lakin altına şərt əlavə olunur

1. Çıxış sətrində 'ac' varsa, onu silin

yəni, əgər (j> 1 && str [j-2] == 'a' && str [j-1] == 'c')
j = j - 2;

S = “abc” sətri üçün tətbiq,

addım 1 : i = 0 ('a'), vəziyyət = BİR, j = 0
Yalnız vəziyyəti İKİ olaraq dəyişdirin

addım 2 : i = 1 ('b'), vəziyyət = İKİ, j = 0
Əvvəlki işarəni, yəni s [j] = 'a' əlavə edin, j-ni 1-ə artırın
Cari char 'b' dir, buna görə əlavə etmə və vəziyyəti ONE olaraq dəyişdirmə

addım 3 : i = 2 ('c'), vəziyyət = BİR, j = 1
Yalnız cari xarakteri, yəni s [j] = s [i], artım j-i 2-yə əlavə edin
İndi s [j-2] == 'a' və s [j-1] = 'c', buna görə j = j-2 et

Çap et []

C ++ Proqramı

#include <iostream>
using namespace std;
#define ONE 1
#define TWO 2
 
// The main function that removes occurences of "a" and "bc"
// in input string
void removeBAndAC(char *s)
{
    //Starting the state will be ONE
    int state = ONE;
 
    //variable for storing chars in output string
    int j = 0;
 
    for (int i = 0; s[i] != '\0'; i++)
    {
        //state is ONE and char is neither a or b, then copy char to output
        if (state == ONE && s[i] != 'a' && s[i] != 'b')
        {
            s[j] = s[i];
            j++;
        }
        //state is TWO and char in not c
        if (state == TWO && s[i] != 'c')
        {
            s[j] = 'a';
            j++;
            //state is TWO and char is neither a or b, then copy char to output    
            if (s[i] != 'a' && s[i] != 'b')
            {
                s[j] = s[i];
                j++;
            }
        }
        if(s[j-2] == 'a' && s[j-1] == 'c')
        {
            j = j-2;
        }
 
        // Change state according to current character
        state = (s[i] == 'a')? TWO: ONE;
    }
 
    // If last character was 'a', copy it to output
    if (state == TWO)
    {
        s[j] = 'a';
        j++;
    }
 
    // Set the string terminator
    s[j] = '\0';
}
 

int main()
{
    char s1[] = "abcabc";
    removeBAndAC(s1);
    cout << s1 << endl;
 
    char s2[] = "aacaaa";
    removeBAndAC(s2);
    cout << s2 << endl;
 
    return 0;
}

Yoxla

 

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