PAT A1038 Recover the Smallest Number
犯的错误在于只考虑了第一个数字的前导0,以及结果为零的时候没有输出,应该是把最终结果的前导0都抹掉,如果都抹没了就输出0,但是只挂了一个测试点,恩,测试点考虑不周~ cmp的想法就是逐位比较两个数,当发现有一位不相等时,把小的排在前面,此时会有两个数位数不同的情况,经过模拟发现可以把短的循环使用,比如32和321,32扩展成3232,所以跟1比较的应该是3;32和323212,32扩展成323232,所以323212胜出 但是看过书上的解法之后,感觉自己就是个二傻子,直接return a+b < b+a 就行了。。。
#include <iostream>
#include <algorithm>
#include <string>
#include <vector>
#include <queue>
#include <math.h>
#include <set>
#include <map>
#include <unordered_map>
#include <stack>
using namespace std;
#define MAXSIZE 10010
vector< string> vs;
bool cmp ( string s1, string s2) {
int i = 0 , j = 0 ;
bool flag1 = false , flag2 = false ;
while ( s1[ i] == s2[ j] ) {
i ++ ;
j ++ ;
if ( i == s1. length ( ) ) {
i = 0 ;
flag1 = true ;
}
if ( j == s2. length ( ) ) {
j = 0 ;
flag2 = true ;
}
if ( flag1 && flag2) return true ;
}
return s1[ i] < s2[ j] ;
}
#define DEBUG
int main ( ) {
#ifdef DEBUG
freopen ( "1.txt" , "r" , stdin ) ;
#endif
int num;
cin >> num;
for ( int i = 0 ; i < num; i ++ ) {
string tmp;
cin >> tmp;
vs. push_back ( tmp) ;
}
sort ( vs. begin ( ) , vs. end ( ) , cmp) ;
string ans = "" ;
for ( int i = 0 ; i < vs. size ( ) ; i ++ ) ans + = vs[ i] ;
int i = 0 ;
while ( ans[ i] == '0' ) i ++ ;
if ( i == ans. length ( ) ) cout << 0 ;
for ( ; i < ans. length ( ) ; i ++ ) {
cout << ans[ i] ;
}
return 0 ;
}