题目难度:一星
考察点:字符串、排序

方法:字符串、排序

1. 分析

我们分析一下题意,对于输入的若干个长度小于100的字符串,每个字符串样本的最后六位均是数字,所以首先需要将每一个字符串中的后六位字符(即数字)提取出来,但是需要注意的是提取的后六位数字仍然是一个字符串,此时将字符串转化为数字,然后对若干组数字的大小进行排序输出即可。
举个例子:
输入3组字符串
hygdhi458611
arfgy123478
acg452361
步骤1:将上述三个字符串中的后六位字符提取出来,得到字符串"458611"、"123478"和"452361"。
步骤2:将提取出来的字符串转换为数字存储在数组中。
步骤3:对这个数组进行排序,然后从小到大输出即可,即123478、452361、458611。

算法实现:
(1). 首先从字符串长度减6位开始,提取字符串的倒数第6位数字,然后依次往后提取,直至将后六位数字都提取出来存在临时变量中。
(2). 接下来对上一步提取出来的纯6位数字字符串进行数字转换。这里可以定义一个函数get_num,从i=0开始计数,i小于字符串长度,进行ans*10+s[i]-'0'的操作,比如"1234"
(a) 0*10+1-'0'= 1
(b) 1*10+2-'0'= 12
(c) 12*10+3-'0'=123
(d) 123*10+4-'0'=1234
得到数字1234。
(3). 用一个数组保存上一步中得到的数字。
(4). 将上述数组的数字进行排序,然后输出。

2. 复杂度分析:

时间复杂度:O(n*log(n))
空间复杂度:O(n)


3. 代码:

#include <bits/stdc++.h>
using namespace std;
const int MAXN = 1e2+5;
int get_num(string s) {
 int ans = 0;
 for(int i=0; i<s.size(); i++) ans = (ans*10+s[i]-'0');
 return ans;
}
int a[MAXN];
int main() {
 int n; cin>>n;
 for(int i=0; i<n; i++) {
     string s; cin>>s;
     string ans;
     for(int j=s.size()-6; j<s.size(); j++) ans += s[j];
     a[i] = get_num(ans);
 }
 sort(a, a+n);
 for(int i=0; i<n; i++) cout<<a[i]<<endl;
 return 0;
}