描述: | 给定字符串内有很多正整数,要求对这些正整数进行排序,然后返回排序后指定位置的正整数
排序要求:按照每个正整数的后三位数字组成的整数进行从小到大排序 1)如果不足三位,则按照实际位数组成的整数进行比较 2)如果相等,则按照输入字符串中的原始顺序排序
说明(以下内容考生无须检查,调用者保证):
1) 字符串以’\0’结尾,仅包含数字、空格
2) 字符串内正整数之间以单个空格分隔,字符串首尾没有空格
3) 正整数格式为十进制,大小:1~1000000,正整数的数字非零开始
示例: 如字符串内容 1223 22 3232 2016
按照规定排序后 2016 22 1223 3232
查询排序后的第3个数是 1223 |
代码:
/*****************************************************************************
Description : 根据字符串内容,输出排序后指定位置的正整数
Input Param : input_string 输入的字符串
serial_number 排序后的序列号,从1开始
output_string_max_length output_string的最大长度,包括'\0'
Output Param : output_string 返回指定的字符串,必须包括'\0',内存由调用者分配和释放
Return Value : 成功返回0,失败返回-1(如:输入字符串是空串、输入序列号超出范围、最大长度不足)
*****************************************************************************/
int find_string(const char* input_string, int serial_number, int output_string_max_length, char* output_string)
{
/* 在这里实现功能 */
if(!input_string||!output_string)
return -1;
char *temp,*temp1;
int len=0;
while(input_string[len]!='\0')
{
len++;
}
int t=0,c=0,j;
char **p=new char*[len];
int *num=new int[len];
*p=new char[len];
temp=*p;
for(int i=0;i<=len;i++)
{
if(i==len||input_string[i]==' ')
{
*temp='\0';
if(t<1||t>1000000)
return -1;
if(t>=1000)
t%=1000;
temp=*(p+c);
j=c;
for(;j>0;j--)
{
if(num[j-1]<=t)
break;
num[j]=num[j-1];
*(p+j)=*(p+j-1);
}
num[j]=t;
*(p+j)=temp;
t=0;
c++;
*(p+c)=new char[len];
temp=*(p+c);
}
else
{
*temp++=input_string[i];
t=t*10+input_string[i]-'0';
}
}
if(serial_number>c)
return -1;
len=0;
temp=p[serial_number-1];
while(*temp!='\0')
{
temp++;
len++;
}
if(len>=output_string_max_length)
return -1;
temp1=output_string;
temp=p[serial_number-1];
while(*temp!='\0')
{
*temp1++=*temp++;
}
*temp1='\0';
return 0;
}