题意:
给两个字符串(只包含'a'-'z' , 'A'-'Z' , '0'-'9'),比较它们的大小。
比较方法:
(1)先把它们分别分割成只包含字母和只包含数字的小块,比如,abc123x分割成“abc”,“123”,“x”。
(2)把小块顺次比较,如果前N个小块都相等,第N+1个小块存在大小差异,那么比较结果与第N+1个小块的比较结果相同,后面的所有小块不再作比较。
(3)如果一方已经没有小块可以比较,那么比较结果与小块数目相同。
小块比较方法:
(1)如果两个小块都只包含字符,那么按照字典序比较("abc" > "abC")
(2)如果两个小块都只包含数字,那么按照数字序比较("12 < "112")
(3)如果一个只包含字母,另一个只包含数字,那么只包含字母的小块更大
思路:
手写split 函数(python等语言里面都有这个函数),模拟。
坑爹之处:
字典序很简单
数字序。。。深坑。。。前置0。。。。
代码就不用多解释了:
#include <iostream>
#include <cstring>
using namespace std;
int t, na, nb;
string a, b;
string pa[1005], pb[1005];
void split(string &s, int &ns, string ps[])
{
ns = 0;
bool flag = isalpha(s[0]);
int len = s.length(), sl = 1, p = 1;
while (p < len)
{
if (bool(isalpha(s[p])) == flag) sl ++;
else
{
ps[ns++] = s.substr(p-sl, sl);
sl = 1;
flag = !flag;
}
p ++;
}
ps[ns++] = s.substr(p-sl, sl);
}
void deleteZero(string &s)
{
int p = 0;
while (p < s.length()-1 && s[p] == '0') p ++;
s = s.substr(p, s.length()-p);
}
int compare(string &s, string &t)
{
if (isalpha(s[0]) && isdigit(t[0])) return 1;
else if (isalpha(t[0]) && isdigit(s[0])) return -1;
else if (isalpha(s[0]))
{
if (s > t) return 1;
if (s < t) return -1;
return 0;
}
else
{
deleteZero(s);
deleteZero(t);
if (s.length() > t.length()) return 1;
if (s.length() < t.length()) return -1;
if (s > t) return 1;
if (s < t) return -1;
return 0;
}
}
char comparison()
{
int ta = 0, tb = 0, c;
while (ta < na && tb < nb)
{
c = compare(pa[ta], pb[tb]);
if (c == 1) return '>';
if (c == -1) return '<';
ta ++; tb ++;
}
if (na > nb) return '>';
if (na < nb) return '<';
return '=';
}
int main()
{
ios::sync_with_stdio(false);
cin >> t;
while (t --)
{
cin >> a >> b;
split(a, na, pa);
split(b, nb, pb);
cout << comparison() << endl;
}
}