想问个问题
是这样的:有一个数组,里面放着四种模式的数字的组合(可以是其它的数字,但必须是那四种组合),
例如:2,2 3,3,3 1,2,3, 4,4,4,4
其中每个数字最多不能超过4个,只能有一对组合是相同的(如2,2)
问题:如何判断这个数组中有 两个相同的数字 的组合?(如:5,5)
程序框架可是下面这样:
#include <iostream>
using namespace std;
bool IsDing(int Pai[], int n)
{
...
}
int main()
{
//例如这里要判断9,9这个组合是否存在
int cpg[] = {1,2,3, 3,3,3, 9,9} //不仅仅是这些,还可以任意组合
if (IsDing(cpg, sizeof(cpg)/sizeof(int))
cout << "有" << endl;
else
cout << "没有" << endl;
return 0;
}
谁来给指点下,我写了好几个,都不行,郁闷了好几天了。给个思路也可以。
----------------解决方案--------------------------------------------------------
普通的搜索查找
如果要效率且要找的数据比较多,可以考虑先nlogn排一下序
(我忙碌中偶尔查资料上线看一下,有其它问题请请教其他高手)
----------------解决方案--------------------------------------------------------
楼主说的不清楚
----------------解决方案--------------------------------------------------------
排序我也想过,但那样会破坏原来的组合。比如:7,8,9 9,9 排序后就成了9,9,9 了
还有就是不可以用二维数组来做,这个本来是项目里的问题,用二维数组会破坏整体结构。
----------------解决方案--------------------------------------------------------
这个问题是我从项目里抽象出来的,描述的可能不是很标准,有不明白的可以说一下。谢谢了。
----------------解决方案--------------------------------------------------------
你只有一个组合啊,
即数组 cpg
----------------解决方案--------------------------------------------------------
#include <iostream>
using namespace std;
bool IsDing(int *Pai, int n)
{
int Judge[2][1000]={{-1},{1}};
int *p1,*p2;
int i=0;
p1=p2=Pai;
do
{
if(*p1==*(p2+1))
{
Judge[1][i]++;
p2=p2+1;
}
else
{
Judge[0][i]=*p1;
p1=p2+1;
i++;
}
}while(p1!=Pai+n);
for(int j=0;j<i;j++)
printf("Judge[0][%d]=%d,Judge[1][%d]=%d\n,",j,Judge[0][j],j,Judge[1][j]);
return 0;
}
int main(void)
{
//例如这里要判断9,9这个组合是否存在
int cpg[] = {1,2,3,3,3,3,9,9}; //不仅仅是这些,还可以任意组合
if (IsDing(cpg, sizeof(cpg)/sizeof(int)))
// cout << "有" << endl;
// else
// cout << "没有" << endl;
return 1;
}
我这个可以提取相临字符的个数.我没按照你的要求,你可以改一下...
----------------解决方案--------------------------------------------------------
/*估计这个应是对的 */
#include "stdio.h"
#include<conio.h>
main()
{
int a[] = {1,2,3,3,9,9,3,3};
int b[30];
int i,j,k=0,num=0,test=0;
for(i=0;i<7;i++)
{ for(j=1;j<8;j++)
if(a[i]==a[j])
{
k++;
}
num++;
b[num]=k;
k=0;
if(b[num]==2)
{
test=a[i];
break;
}
}
printf("num=%d test=%d",b[num]-1,test);
getchar();
}
----------------解决方案--------------------------------------------------------
/*
如果数组中有2个连续的数字相同,并且下一个数字不同,则返回1,否则返回0。
函数接受2个参数,第一个是数组的首地址,第二个是数组的大小
*/
int is_double(int * ar, int n)
{
int i, temp, k;
if(n < 2)
return 0;
temp = ar[0];
i = k = 1;
while(i < n)
{
if(temp == ar[i])
k++;
else if(k == 2)
break;
if(k > 2)
k = 0;
temp = ar[i];
i++;
}
return ((k == 2) ? 1 : 0);
}
----------------解决方案--------------------------------------------------------
我的已经把所有相临的字符的个数都统计下来了.这样比较直接
----------------解决方案--------------------------------------------------------