c++ - 运行长度压缩仅用于循环
问题描述
我正在尝试使用运行长度编码。
问题是... a 是 2 次但是 cout show f 是 3。A 没有显示在结果中。最后一个元素计数 var count 保持等于最后一个元素。
#include <iostream>
using namespace std;
int main()
{
string str = "aafffkhjskk";
int arr[100];
int count = 1;
cout << str << endl;
// print text on screen
for (int r = 0; r < str.length(); r++) {
// Str 0 strating point
for (int in = r; in < str.length(); in++) {
// r = in because increment finding element
if (str[r] == str[in]) {
count++;
}
else {
r += (count - 1);
// r value is equal to count
cout << " r " << r << " count " << count << endl;
cout << count << " ****** "
<< str[r] << endl;
count = 1;
// making count 1 again.
break;
}
}
} // for end here
}
解决方案
您选择的r
(下一个起始位置)不正确。我建议使用 ar_next
来标记下一个字符,它是与当前搜索字符最近的不同字符。pick_next
指示是否设置的标志r_next
(0 未设置,1 设置)。下一次搜索将设置为从r_next
:
#include <iostream>
using namespace std;
int main()
{
string str = "aafffkhjskk";
int pick_next, r_next, count;
cout << str << endl;
int r = 0, count = 0;
while ((r + count) < str.size()) {
count = 0; // Str 0 strating point
pick_next = 0;
for (int in = r; in < str.length(); in++) {
// r = in because increment finding element
if (str[r] == str[in]) {
count++;
}
// mark the first non-identical position
else {
if (pick_next == 0) {
r_next = in;
pick_next = 1;
}
}
}
cout << "count = " << count << " ****** " << str[r] << endl;
r = r_next; // place r for next search
} // end of while
}
Test run:
$ ./a.exe
aafffkhjskk
count = 2 ****** a
count = 3 ****** f
count = 3 ****** k
count = 1 ****** h
count = 1 ****** j
count = 1 ****** s
count = 2 ****** k
--
推荐阅读
- arrays - 通过使用可能的数组在 awk 中以困难模式分析两列来计数
- javascript - Cypress 元素不可见,因为它的有效宽度和高度为 0 x 0 像素
- java - java.lang.Long 不能转换为 java.lang.Double 我错过了什么?
- php - PHP group 和 sum 多维数组
- react-native - 分享到 Instagram 故事永远不会兑现承诺
- c - C 在一个大矩阵中找到亚对称矩阵
- android - ListAdapter - 我不知道我的应用程序崩溃是什么
- r - R 错误或替代方案中的 expand_dims
- json - JsonPath:获取字符串列表中的第一个元素
- go - 如何编写具有不同签名的相同方法的多个实现