Почему этот метод go в бесконечное l oop? - PullRequest
1 голос
/ 10 января 2020

Мое время l oop стало бесконечным, несмотря на использование оператора декремента. Не могли бы вы объяснить, почему это так? Разве это не должно произойти через l oop, когда условие станет ложным?

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

    const int MAX_CHAR = 26; 

    // Function to print the string 
    void printGrouped(string str) 
    { 
        int n = str.length(); 

        // Initialize counts of all characters as 0 
        int  count[MAX_CHAR] = {0};           

        for (int i = 0 ; i < n ; i++) 
            count[str[i]-'a']++; 

        for (int i = 0; i < n ; i++) 
        {                
            while (count[str[i]-'a']--)
                cout << str[i];
        } 
    } 

    // Driver code 
    int main() 
    { 
        string str = "applepp";           
        printGrouped(str); 
        return 0; 
    } 

Ответы [ 2 ]

1 голос
/ 11 января 2020

Проблема в

while(count[str[i]-'a']--) { ... }

причина в том, что выражение

x--

уменьшает x и возвращает исходное значение (до уменьшения). Использование условия while, например

while(x--) { ... }

, завершает l oop, когда x изменяется с 1 на 0, но если вы введете while снова, у вас возникнет проблема, потому что x добрался до -1 и он не вернется к нулю, уменьшив его.

-1 - это "истинное значение" для теста в течение некоторого времени, поэтому он войдет в l oop и станет -2, затем l oop снова и становитесь -3 и так далее до тех пор, пока не получите переполнение и неопределенное поведение.

Вероятно, l oop должно быть записано как

while(count[str[i]-'a']) {
    count[str[i]-'a']--;
    ....
}

, чтобы вы уменьшали его ТОЛЬКО если не ноль

1 голос
/ 11 января 2020

Я вижу, что у вас есть выражение в скобках while (*) "()". Лучше иметь условие там, вы должны поместить это выражение в l oop, а затем вам нужно добавить условие, связанное с этим выражением, в эти скобки "()" давайте предположим, что вы wi sh выйдете из l oop когда значение выражения равно -1. Я не уверен насчет synatx, просто попытался продемонстрировать мою логику c в коде.

  x= count[str[i]-'a']-1;
   While(x!=-1)
   {
     cout << str[i];
     x= count[str[i]-'a']-1;
   }
...