OJ 系列之整型字符串排序

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; 
}

你可能感兴趣的:(OJ,整型字符串排序)