字符串排序
字符串排序
http://www.nowcoder.com/questionTerminal/0425aa0df74646209d3f56f627298ab2
题目难度:一星
考察点:字符串、排序
方法:字符串、排序
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; }