我数据结构学得不好啊。有个问题想不来了,比如:
给个数组,1,2,2,5,5,5,6,666,7,7,7,8
实现统计里面各个元素出现了多少次。比如有几个2,几个7。使用最简单得方法。怎么做啊??
给个数组,1,2,2,5,5,5,6,666,7,7,7,8
实现统计里面各个元素出现了多少次。比如有几个2,几个7。使用最简单得方法。怎么做啊??
解决方案 »
- 请问为什么SetWindowOrgEx参数是负值?
- 如果改变CSliderCtrl的滑块的颜色?(不是整个控件颜色)
- 网址过滤问题
- 怎样在线程中关闭整个进程,如何做到,谢谢
- 一个有关VC内联的问题
- 如何解决记事本中的中文输入问题
- Win2k 里怎么样才能屏蔽Alt+Tab,Alt+Esc,windows,Ctrl+Alt+Del键阿?
- *** 如何实现驱动程序的自动安装, 100分 ***
- 我在一个CFormView视图中加入了一个MSComm控件,我想在另一个CFormView类中得到串口信息,能作到吗?
- 不用向导编写代码而导致的问题
- 菜鸟求助----如何连接Mysql数据库啊!
- 各位看看如下代码哪错了?应该怎么改?
int k[20];//保存每个数出现的次数
int count;
for(int i=0;i<12;i++)
{ for(int j=1;j<12;j++)
{ if(a[i]==a[j])
count++;
k[i]=count;
}
count=0;
}
没有验证的.
int a[12]={1,2,2,5,5,5,6,666,7,7,7,8};
int k[12]={1,1,1,1,1,1,1,1,1,1,1,1};
for(int i=0;i<12;k[i]!=0;i++)
for(int j=0;j<12;j++)
{
if(a[i]==a[j])
{k[i]+=k[j];
k[j]=0;
break;}
for(int i=0;i<12;k[i]!=0;i++)
printf("%d:%d 次",a[i],k[i]);
{
int nValue;
int nCount;
CountInfo* pNext;
};void CTestDlg::OnButton1()
{
int Number[] = {1,2,2,5,5,5,6,666,7,7,7,8};
count(Number,sizeof(Number) / sizeof(Number[0]));
}void CTestDlg::count(int *pArray, int nArraySize)
{
CountInfo *pHead = NULL,*pTail = NULL,*pInfo = NULL; for (int i = 0; i < nArraySize;++i)
{
pInfo = pHead;
while (pInfo)
{
if (pInfo->nValue == pArray[i])
{
pInfo->nCount++;
break;
}
else
pInfo = pInfo->pNext;
}
if (!pInfo)
{
pInfo = new CountInfo;
if (!pHead)
pHead = pInfo;
if (pTail)
pTail->pNext = pInfo;
pTail = pInfo;
pInfo->nValue = pArray[i];
pInfo->nCount = 1;
pInfo->pNext = NULL;
}
}
char sz[100];
m_sz = "数值\t次数";
pInfo = pHead;
while (pInfo)
{
m_sz += "\r\n";
itoa(pInfo->nValue,sz,10);
m_sz += sz;
m_sz += '\t';
itoa(pInfo->nCount,sz,10);
m_sz += sz;
pInfo = pInfo->pNext;
}
UpdateData(FALSE); pInfo = pHead;
while (pInfo)
{
pHead = pInfo->pNext;
delete pInfo;
pInfo = pHead;
}
}
但要加一句
CString m_sz;
m_sz = "数值\t次数";laiyiling(最熟悉的陌生人) 存在一个剔除重复的问题。谢谢大家。
sailor_2002(我心依旧) 的说法我想过但是没有写成功。
无比感谢大家。
“好像哈夫曼算法可以解决这个问题,你这个问题类似于找最优二叉树,按路径长度来统计出现次数
”属于典型的简单问题复杂化。
不知道我总结的对不对。如果大家还感兴趣继续讨论。分不够可以再加。
真的是高手啊!
可是我有点太笨了,看不明白啊
能不能给分析一下啊
还有啊
我觉得laiyiling(最熟悉的陌生人)的没什么问题啊(我没有自己验证!)
为什么会有重复的呢?
我做了注解。大家共享。谢谢。不知道对不对。
struct CountInfo
{
int nValue;//值本身
int nCount;//计数
CountInfo* pNext;//下一个的指针。因为是数组。总有个结尾。必须有个指针。
};//定义结构体;用来保存数据。个数,以及指针指向下一个。void CTestDlg::OnButton1()
{
int Number[] = {1,2,2,5,5,5,6,666,7,7,7,8};
count(Number,sizeof(Number) / sizeof(Number[0]));//这句代码经典。尤其是个数的计算。
}void CTestDlg::count(int *pArray, int nArraySize)
{
CountInfo *pHead = NULL,*pTail = NULL,*pInfo = NULL;
//定义三个指针。头。尾,以及结构体本身。 for (int i = 0; i < nArraySize;++i)//开始循环。
{
pInfo = pHead;//将结构体指向头指针
while (pInfo)
{
if (pInfo->nValue == pArray[i])
{
pInfo->nCount++;
break;
}
else
pInfo = pInfo->pNext;
}//开始循环。没有结束继续循环。写得太好了。
if (!pInfo)//指针为空,刚开始必须创建
{
pInfo = new CountInfo;
if (!pHead)
pHead = pInfo;
if (pTail)
pTail->pNext = pInfo;
pTail = pInfo;//创建完成,但是没有和数组关联。
pInfo->nValue = pArray[i];//关联。赋值。
pInfo->nCount = 1;//刚开始指向第一个,已经有一个了。计数为1
pInfo->pNext = NULL;//刚开始创建。next当然为空。
}//创建完成后以后就不执行了。
}
char sz[100];
m_sz = "数值\t次数";
pInfo = pHead;//指向头部。循环显示。
while (pInfo)//循环显示值及其计数。
{
m_sz += "\r\n";
itoa(pInfo->nValue,sz,10);
m_sz += sz;
m_sz += '\t';
itoa(pInfo->nCount,sz,10);
m_sz += sz;
pInfo = pInfo->pNext;
}
pInfo = pHead;/循环清除结构体。
while (pInfo)
{
pHead = pInfo->pNext;
delete pInfo;
pInfo = pHead;
}
AfxMessageBox(m_sz);//显示统计结果。
UpdateData(FALSE);
}
我觉得laiyiling(最熟悉的陌生人)的思路很好。问题在于如何剔除重复。我在他思路的提示下这样写了算法。当然了这种思路好理解。
//在头文件中定义结构体
#include <vector>
using namespace std;
struct countValue
{
int value;
int num;
};
//和vector。因为为了剔除重复。我只有这么做了】
下面在代码中写。#define ARRAY_NUM 12
int a[ARRAY_NUM]={1,2,2,5,5,5,6,666,7,7,7,8}; countValue mplist[ARRAY_NUM];
int count=0;
for(int i=0;i<ARRAY_NUM;i++)
{ for(int j=0;j<ARRAY_NUM;j++)
{ if(a[i]==a[j])
count++;
mplist[i].value = a[i];
mplist[i].num = count;
}
count=0;
}
vector<countValue>resultv;
static bool bFound = false;
for(i=0;i<ARRAY_NUM;i++)
{
for(int j=0;j<resultv.size();j++)
{
if(mplist[i].value ==resultv[j].value)
{
bFound = true;
break;
}else bFound = false;
}
if(!bFound)
{
resultv.push_back(mplist[i]);
bFound = false;
}
} //************************************************
CString str;
for(i=0;i<resultv.size();i++)
{
if(mplist[i].num!=0)
{
str.Format("%d:: %d-----> %d",i,resultv[i].value,resultv[i].num);
AfxMessageBox(str);
} }
resultv.clear();