1、问题描述
给定字符串内有很多正整数,要求对这些正整数进行排序,然后返回排序后指定位置的正整数
排序要求:按照每个正整数的后三位数字组成的整数进行从小到大排序
1)如果不足三位,则按照实际位数组成的整数进行比较
2)如果相等,则按照输入字符串中的原始顺序排序
说明(以下内容考生无须检查,调用者保证):
1) 字符串以’\0’结尾,仅包含数字、空格
2) 字符串内正整数之间以单个空格分隔,字符串首尾没有空格
3) 正整数格式为十进制,大小:1~1000000,正整数的数字非零开始
示例:
如字符串内容
1223 22 3232 2016
按照规定排序后
2016 22 1223 3232
查询排序后的第3个数是
1223
2、解题思路
- 1、首先从字符串中按照空格以及结束位来分离出各个整数
- 2、将各个整数入栈,使用vector变量,比较便利,易操作
- 3、使用冒泡法比较后三位的数据,然后进行排序
- 4、打印输出到output_string,采用sprintf将整型数据打印到字符数组中
3、代码实现
/******************************************************************************
Copyright (C), SCUT.
******************************************************************************
File Name :
Version :
Author : ZP1015
Created : 2016/1/16
Last Modified :
Description :
Function List :
History :
1.Date : 2016/1/16
Author : ZP1015
Modification: Created file
******************************************************************************/
#include <vector>
using namespace std;
/*****************************************************************************
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)
{
/*1.异常处理*/
if(!input_string||!output_string)
return -1;
if(serial_number<1||output_string_max_length<1)
return -1;
int len = strlen(input_string);
if(len==0)
return -1;
vector<int> vec;
int i = 0,j = 0;
int temp = 0;
int veclen = 0;
/*2.字符串中分离各个数据,注意i是小于等于len*/
for(i=0;i<=len;i++) {
/*空格和最后一组数据*/
if(input_string[i]==' '||i==len) {
if(temp == 0) {
return -1;
}
vec.push_back(temp);
temp = 0;
} else {
temp = temp*10+input_string[i]-'0';
}
}
veclen = vec.size();
if(serial_number > vec.size()){
return -1;
}
/*3.采用冒泡法比较后三位*/
for(i = veclen-1;i>=0;i--) {
for(j = 0;j<i;j++) {
if(vec[j]%1000 >vec[j+1]%1000) {
temp = vec[j+1];
vec[j+1] = vec[j];
vec[j] = temp;
}
}
}
/*4.打印输出到output_string*/
char num[11]; /*整数分布范围1-1000000*/
/*打印到num里面输出*/
sprintf(num,"%d",vec[serial_number - 1]);
len = strlen(num);
/*output_string_max_length 包含了'\0'*/
if ((len + 1) > output_string_max_length){
return -1;
}
strcpy(output_string,num);
return 0;
}