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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

狂奔的乌龟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值