1. 程式人生 > >OJ 系列之整型字串排序

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