我编写了一小段代码,可以在一维数组上执行运行长度编码类型的东西,但仍然远远没有达到预期的结果。
main()
{
int a[8]={2,0,0,0,3,0,0,9};
int i,temp,ct=0,flag,m;
int found[90]={0};
for(i=0;i<=7;i++)
{
if(!a[i])
{
ct++;
if(!found[a[i]])
{
flag=i;
found[a[i]]=1;
}
}
}
a[flag]=ct;
m=ct;
for(i=0;i<m;i++)
{
printf("%d",a[i]);
}
}/* end of main*/
现在对于上面的数组我希望输出一些
2 5 0 3 9
但是我的代码正在变得
2 5 0 0 3
我可以就此提出任何建议吗?
答案 0 :(得分:3)
不应该运行长度编码将2,0,0,0,3,0,0,9变为2 1 0 3 3 1 2 0 9 1?
1)我看到的第一件事是错误的是你没有看整个阵列。你正在使用&lt;在8之前停止,但也在7停止,所以你只评估数组项目0 - 6。
2)如果ct代表计数,它永远不会重置(仅在声明时ct = 0)。它的作用是:a [flag] = ct;它会覆盖您的原始数据。它基本上跟踪了i的价值。
这是我刚刚整理的版本:
#define SZ 8
main()
{
int a[SZ]={2,0,0,0,3,0,0,9};
int i; //absolute position
int runningCount = 1; //because we start at array index 1 and not zero
for (i = 1; i <= SZ; i++) {
if (a[i - 1] == a[i]) //value same as one before it...
runningCount++;
else { // new value found. print last one, and the count of the last one.
printf("%d %d ", a[i - 1], runningCount);
runningCount = 1; //reset for next loop
}
}
return 0;
}
输出为2 1 0 3 3 1 0 2 9 1
根据下面留下的评论,你的算法实际上看起来像这样:
#define SZ 8
main()
{
int a[SZ]={2,0,0,0,3,0,0,9};
int i; //absolute position
int zero_count = 0; //target zeros specifically...
for (i = 0; i < SZ; i++) {
if (a[i] == 0)
zero_count++;
}
//now write it out in a bizarre, unparsable format again...
for (i = 0; i < SZ; i++) {
if (a[i] != 0) //write out all non zero values
printf("%d ", a[i]);
if (i == 0) { //this says put the zero count after the first number was printed
printf("%d 0 ", zero_count); //inserting it into a strange place in the array
}
}
return 0;
}
输出:2 5 0 3 9
答案 1 :(得分:0)
你的for循环中需要一个&lt; =
for(i=0;i<=7;i++)
而不是
for(i=0;i< 7;i++)
否则你会错过最后一个元素。
答案 2 :(得分:0)
您似乎正在做的是(a)计算数组中出现0的次数,以及(b)用该计数替换第一次出现的0。目前尚不清楚这是一个有用的编码方式。
在任何情况下,你都没有得到你想要的结果,至少部分是因为你只修改了数组的一个元素。我怀疑你想要的,或者至少你想要的是,当遇到它们时,将数组的非零元素移到左边。
以您提议的方式压缩阵列有什么用?是否有其他一些代码需要重建原始代码,如果是这样,您希望如何从您期望的结果中这样做?