01/10/2018, 12:14

Lỗi out of range c++

Nó báo lỗi như này là sao ạ?
terminate called after throwing an instance of ‘std::out_of_range’
what(): basic_string::at: __n (which is 0) >= this->size() (which is 0)
link hackkerrank: https://www.hackerrank.com/challenges/reduced-string/problem

> #include <bits/stdc++.h>

> using namespace std;

> string super_reduced_string(string s){
>     // Complete this function
>     int count = -1;
>     for(int i=0;i<s.length()-1;i++) if(s.at(i)==s.at(i+1)){ count = i; break;}else{count=-1;}
>     while(count != -1){
>         s.erase(count,2);
>         for(int i=0;i<s.length()-1;i++) if(s.at(i)==s.at(i+1)){ count = i;break;}else{count=-1;}
>     }
>    return s;
> }

> int main() {
>     string s;
>     cin >> s;
>     string result = super_reduced_string(s);
>     cout << result << endl;
>     return 0;
> }
HK boy viết 14:15 ngày 01/10/2018

Chỗ này

s.erase(count,2);

count == -1 thì sao?

Có vẻ như bạn chạy vòng while đến mức xâu s rỗng. Bạn thử in ra s sau vòng for xem sao.

rogp10 viết 14:28 ngày 01/10/2018

Bài này có thể giải trong O(n) time và space, và ít phức tạp hơn.

Trần Hoàn viết 14:15 ngày 01/10/2018

std::out_of_range

Truy cập phần tử ngoài khoảng cho phép
Ví dụ như khi string.length = 5 mà bạn lại truy cập s[7] hoặc s[i] với i<0 thì sẽ bị như thế

Võ Trường Trung Hiếu viết 14:25 ngày 01/10/2018

Cảm ơn mọi người em fix được rồi. Thứ 1 là do s.length()-1 chỉ nhận giá trị dương mà -1<0 nên nó bị lỗi. Thứ 2 là sau dòng s.erase() em quên gán count = -1 nên nó lặp vô tận khi vòng for phí dưới không thục hiện.

Bài liên quan
0