2016/12/15 1002. Extended Normal Order Sort

参考: http://www.lxway.com/4044821961.htm

题目的意思有毒,有很多地方是要自己不断WA去摸索的,题意定义的排序是这样的:

1.小写字母按大写字母来处理;
2.若一个加减号在一个数字的前面,而不在一个数字的后面,那这个加减号表示正负;
3.一般字符按ASCⅡ码来处理。
因此对于每个输入的字符串要做的操作是:
1.数值为0的子字符串(0、00、+00、-0等等)全部删去;
2.表示数字的的子字符串,统一在前面加上加(减)号表示正(负);
3.小写字母全部转换成大写字母;   
而比较时对应的比较方法是:
若是当前位置都是数字,比较数字大小;否则,若都是表示正负的加减号,减号优先;其余的情况,按照ASCⅡ码进行比较。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cctype>
using namespace std;
bool issign(char s[], int i) 
{
	return (i == 0 || !isdigit(s[i - 1])) && (s[i] == '+' || s[i] == '-') && isdigit(s[i + 1]);
}

void formalize(char s[]) 
{
	int i, j;
	static char temp[1000];

	for (i = 0, j = 0; i < strlen(s); i++, j++) {
		if (isdigit(s[i])) {
			if (i == 0 || (s[i - 1] != '+' && s[i - 1] != '-'))
				temp[j++] = '+';
			while (s[i] == '0')
				i++;
			while (isdigit(s[i]))
				temp[j++] = s[i++];
			if (temp[j - 1] == '+' || temp[j - 1] == '-')
				j--;
		}
		temp[j] = (s[i] >= 'a' && s[i] <= 'z' ? s[i] - 32 : s[i]);
	}
	temp[j] = '\0';
	strcpy(s, temp);
}

int cmp(char s1[], char s2[]) {
	static int len1, len2;

	formalize(s1);
	formalize(s2);
	for (int i = 1, j = 1; i < strlen(s1) && j < strlen(s2); i++, j++) {
		if (isdigit(s1[i]) && isdigit(s2[j])) {
			int k = i;
			while (isdigit(s1[k]))
				k++;
			len1 = k - i;
			k = j;
			while (isdigit(s2[k]))
				k++;
			len2 = k - j;

			if (len1 != len2)
				return (len1 < len2 ? -1 : 1);
			else {
				while (i < k && j < k) {
					if (s1[i++] != s2[j++])
						return (s1[i] < s2[j] ? -1 : 1);
				}
			}
		}

		if (s1[i] != s2[j]) {
			if (issign(s1, i) && issign(s2, j))
				return (s1[i] == '-' ? -1 : 1);
			return (s1[i] < s2[j] ? -1 : 1);
		}
	}

	return 0;

}


int main()
{
	int N, i;
	char s1[1000], s2[1000];

	cin >> N;
	for (i = 1; i <= N; i++) {
		scanf("%s%s", s1, s2);
		cout << i << " " << cmp(s1, s2) << endl;
	}

	return 0;

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值