【Openjudge】求序列中的众数

/*
 * 思路:
 * 1,输入数字
 * 2,判断数字的第一位是不是+,-,如果是,保留,如果不是,那么将所有其他字符后移一位并将字符串的第一个位置置为+
 * 3,之后,从字符串第二位开始寻找到第一个不是,‘0’的字符,如果到字符串结尾的时候依然是'0',那么该字符串代表数字0,将字符串第三位的值置为字符串的结束符,值为0,并且将其第一位置为+(因为可能有输入为-000这种情况).
 * 4,将该临时字符串与已经保存的字符串进行匹配,如果找到相同的,那么该相同的的count+1,否则,增加一个新的数字到已经保存的数组中,将其count+1
 * 5, 录入完成后,遍历整个数组,寻找count(即程序中结构体中的c)最大的值,保存为max
 * 6,重新遍历,搜索岛第一个count为max的数
 * 7,如果这时候,q[1].n[0] == 0,表示所有的数字都是一样的,那么我们输出no
 * 8,否则的话,所有的数字不是都一样的,那么我们输出该数字。
 */
 


#include
#include
#include
#include
using namespace std;
int main()
{
	struct dedema//随便建了一个结构,里边n代表用字符表示的数字,c代表这个数字出现的次数
	{
		char n[100];
		int c;
	};
	struct dedema q[150] =
	{ };
	int n;
	int i, j;
	int pos; //指针,用于锁定数字中除了+,-以外,第一个非0的字符
	int max = 0;
	char tn[150] =
	{ };
	int count = 0;
	cin >> n;
		
	for (i = 0; i < n; i++)//输入,以及输入的处理
	{
		cin >> tn;//输入数字
		pos = 0;//置pos为0
		if (tn[pos] >= '0' && tn[pos] <= '9')
		{
			for (j = strlen(tn); j > 0; j--)
			{
				tn[j] = tn[j - 1];
			}
			tn[0] = '+';
		}

		pos = 1;
		while (tn[pos] == '0')
			pos++;
		if (pos == strlen(tn))
		{
			tn[2] = 0;
			tn[0] = '+';
		}
		else
		{
			strcpy(&tn[1], &tn[pos]);
		}
		for (j = 0; j < count; j++)
		{
			if (!strcmp(q[j].n, tn))
			{
				q[j].c++;
				break;
			}
		}
		if (j == count)
		{
			strcpy(q[j].n, tn);
			q[j].c++;
			count++;
		}
		memset(tn, 0, 140);
	}
	
	for (i = 0; i < count; i++)
	{
		if (q[i].c > max)
			max = q[i].c;
	}
	if (q[1].c == 0)
	{
		cout << "no" << endl;
	}
	else
	{
		for (i = 0; i < count; i++)
		{
			if (q[i].c == max)
			{
				if (q[i].n[0] == '-')
					cout << q[i].n << endl;
				else
					cout << &q[i].n[1] << endl;
				break;
			}
		}
	}
	return 0;
}


你可能感兴趣的:(Openjudge)