今天在刷题时遇到这个错,题目如下:
1 2 3 4 5 6 7
| 字符串压缩。利用字符重复出现的次数,编写一种方法,实现基本的字符串压缩功能。比如,字符串aabcccccaaa会变为a2b1c5a3。若“压缩”后的字符串没有变短,则返回原先的字符串。你可以假设字符串中只包含大小写英文字母(a至z)。
输入:"aabcccccaaa" 输出:"a2b1c5a3"
输入:"abbccd" 输出:"abbccd"
|
题目不难,遍历一遍就完事了,每次把不同的字符和次数加载新字符串后面,问题就出现在次数上:
1 2
| ans.push_back(s[i]); ans.push_back('0'+i-cur);
|
0-9 这样是没问题的,但是超过 9 就有问题了,提交代码就错了:
1 2 3
| 输入:"rrrrrLLLLLPPPPPPRRRRRgggNNNNNVVVVVVVVVVDDDDDDDDDDIIIIIIIIIIlllllllAAAAqqqqqqqbbbNNNNffffff" 输出:"r5L5P6R5g3N5V:D:I:l7A4q7b3N4f6" 预期:"r5L5P6R5g3N5V10D10I10l7A4q7b3N4f6"
|
查 ASCII 表就可以发现问题,9
后面是 :
,正如错误答案一样 :p
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| 二进制 十 八 图形 0011 0000 48 30 0 0011 0001 49 31 1 0011 0010 50 32 2 0011 0011 51 33 3 0011 0100 52 34 4 0011 0101 53 35 5 0011 0110 54 36 6 0011 0111 55 37 7 0011 1000 56 38 8 0011 1001 57 39 9 0011 1010 58 3A : 0011 1011 59 3B ; 0011 1100 60 3C < 0011 1101 61 3D = 0011 1110 62 3E > 0011 1111 63 3F ?
|
后面查了一下,C++ 11 有个新函数用来将 int 转 string:
1 2 3 4 5 6 7 8 9
| std::string to_string(int value); (1) (C++11起) std::string to_string(long value); (2) (C++11起) std::string to_string(long long value); (3) (C++11起) std::string to_string(unsigned value); (4) (C++11起) std::string to_string(unsigned long value); (5) (C++11起) std::string to_string(unsigned long long value); (6) (C++11起) std::string to_string(float value); (7) (C++11起) std::string to_string(double value); (8) (C++11起) std::string to_string(long double value); (9) (C++11起)
|
替换掉之后就 OK 了!