[华为机试练习题]12.整型字符串排序

题目

给定字符串内有很多正整数,要求对这些正整数进行排序,然后返回排序后指定位置的正整数 

排序要求:按照每个正整数的后三位数字组成的整数进行从小到大排序
1)如果不足三位,则按照实际位数组成的整数进行比较
2)如果相等,则按照输入字符串中的原始顺序排序 

说明(以下内容考生无须检查,调用者保证):
1) 字符串以’\0’结尾,仅包含数字、空格
2) 字符串内正整数之间以单个空格分隔,字符串首尾没有空格
3) 正整数格式为十进制,大小:1~1000000,正整数的数字非零开始 

示例:
如字符串内容
1223 22 3232 2016

按照规定排序后
2016 22 1223 3232

查询排序后的第3个数是
1223 

知识点:
工程环境请使用VS2005

题目来源:    软件训练营
维护人:     d00191780
练习阶段:    中级

代码

/*---------------------------------------
*   日期:2015-06-29
*   作者:SJF0115
*   题目:整型字符串排序
*   来源:华为上机
-----------------------------------------*/
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
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)
{
    if(input_string == NULL || output_string == NULL){
        return -1;
    }//if
    if(serial_number < 1 || output_string_max_length < 1){
        return -1;
    }//if
    int size = strlen(input_string);
    vector<int> vec;
    int tmp = 0;
    for(size_t i = 0;i <= size;++i){
        if(input_string[i] == ' ' || i == size){
            if(tmp == 0){
                return -1;
            }//if
            vec.push_back(tmp);
            tmp = 0;
        }//if
        else{
            tmp = tmp * 10 + input_string[i] - '0';
        }//else
    }//for
    //冒泡排序
    int n = vec.size();
    for(int i = 0;i < n-1;++i){
        for(int j = 0;j < n-i-1;++j){
            if(vec[j] % 1000 > vec[j+1] % 1000){
                swap(vec[j],vec[j+1]);
            }//if
        }//for
    }//for
    if(serial_number > vec.size()){
        return -1;
    }//if
    char num[11];
    sprintf(num,"%d",vec[serial_number - 1]);
    int len = strlen(num);
    if ((len + 1) > output_string_max_length){
        return -1;
    }//if
    strcpy(output_string,num);
    return 0;
}
时间: 2024-09-19 03:32:34

[华为机试练习题]12.整型字符串排序的相关文章

[华为机试练习题]47.整型反序

题目 描述: 简要描述:给出一个不多于5位的整数, 进行反序处理 要求: 1.求出它是几位数 2.分别输出每一位数字 3.按逆序输出各位数字,例如原数为321,应输出123(仅数字间以空格间隔, 负号与数字之间不需要间隔) 例如: 输入: 12345 输出: 5 1 2 3 4 5 54321 注意:如果是负数,负号加在第一个数字之前, 与数字没有空格间隔 比如 输入: -12345 输出: 5 -1 2 3 4 5 -54321 函数原型: /* 输入: iInput: 位数不大于5的整数 输

[华为机试练习题]61.找出字符串中第一个出现次数最多的字符

题目 描述: 找出字符串中第一个出现次数最多的字符 详细描述: 接口说明 原型: bool FindChar(char* pInputString, char* pChar); 输入参数: char* pInputString:字符串 输出参数(指针指向的内存区域保证有效): char* pChar:出现次数最多的字符 返回值: false 异常失败 true 输出成功 练习阶段: 初级 代码 /*--------------------------------------- * 日期:2015

[华为机试练习题]43.在字符串中找出连续最长的数字串

题目 描述: 请一个在字符串中找出连续最长的数字串,并把这个串的长度返回:如果存在长度相同的连续数字串,返回最后一个连续数字串: 注意:数字串只需要是数字组成的就可以,并不要求顺序,比如数字串"1234"的长度就小于数字串"1359055",如果没有数字,则返回空字符串("")而不是NULL! 样例输入 abcd12345ed125ss123058789 abcd12345ss54761 样例输出 输出123058789,函数返回值9 输出547

[华为机试练习题]29.Arrange an Array to Form a Smallest Digit

题目 描述: Question: Input an array of positive integers, arrange the integers to form new digits, and output the smallest digit among all the new ones. Input Example 1: {2, 1} Output Example 1: 12 Input Example 2: {32, 321} Output Example 2: 32132 Input

[华为机试练习题]71.一元多项式化简

题目 背景: 编程实现如下功能:对输入的一元多项式,进行同类项合并,并按指数降序排序,输出处理后的一元多项式. 说明: 多项式由若干个单项式组成,单项式之间为加.减(+,-)关系. 单项式指数字与字母幂的乘积构成的代数式.对一元多项式,字母只有一种. 同类项合并指将多项式中指数相同的单项式,系数经过加减求和,合并为一个单项式.按指数降序指多项式中,单项式按指数从大到小顺序相连. 格式说明 一元多项式输入输出时以字符串形式表示,格式如下 单项式之间用单个加减运算符相连,运算符:+,- 单项式由系数

[华为机试练习题]1.周期串问题

题目一[周期串问题] 如果一个字符串可以由某个长度为k的字符串重复多次得到,我们说该串以k为周期.例如,abcabcabcabc以3为周期(注意,它也可以6和12为周期,结果取最小周期3).字符串的长度小于等于100,由调用者保证. 接口说明 原型: int GetMinPeriod(char *inputstring); 输入参数: char * inputstring:字符串 返回值: int 字符串最小周期 代码一 /*-----------------------------------

[华为机试练习题]53.整数相除(AC 但还有bug)

题目 描述: 实现接口: /--------------------------------------------------------------------------------- Description : 整数相除. Input : unsigned int dividend :被除数,取值为无符号整数. unsigned int divisor: 除数,取值为无符号整数. Output : Char *pResult : 运算结果. Return Value : 0:成功: -1

[华为机试练习题]34.识别有效的IP地址和掩码并进行分类统计

题目 描述: 请解析IP地址和对应的掩码,进行分类识别.要求按照A/B/C/D/E类地址归类,不合法的地址和掩码单独归类. 所有的IP地址划分为 A,B,C,D,E五类 A类地址1.0.0.0~126.255.255.255; B类地址128.0.0.0~191.255.255.255; C类地址192.0.0.0~223.255.255.255; D类地址224.0.0.0~239.255.255.255: E类地址240.0.0.0~255.255.255.255 私网IP范围是: 10.0

[华为机试练习题]36.简单错误记录

题目 描述: 开发一个简单错误记录功能小模块,能够记录出错的代码所在的文件名称和行号. 处理: 1. 记录最多8条错误记录,循环记录,对相同的错误记录(净文件名称和行号完全匹配)只记录一条,错误计数增加: 2. 超过16个字符的文件名称,只记录文件的最后有效16个字符: 3. 输入的文件可能带路径,记录文件名称不能带路径. 题目类别: 字符串 难度: 中级 运行时间限制: 10Sec 内存限制: 128MByte 阶段: 入职前练习 输入: 一行或多行字符串.每行包括带路径文件名称,行号,以空格