OJ 系列之整型字串排序
阿新 • • 發佈:2019-01-02
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;
}