【hihocoder】#1566 : 皇室成员的名字[Offer收割]编程练习赛25

时间限制: 10000ms
单点时限: 1000ms
内存限制: 256MB

描述

小Ho正在学习世界历史。他发现历史上很多西方国家的皇室成员的名字都是由英文名字加罗马数字组成的,例如George IV(乔治四世)、William IV(威廉四世)、Elizabeth II(伊丽莎白二世)等。  

为了更好的梳理历史脉络,小Ho决定写个程序把历史书上出现过的皇室名字排序:首先按英文名字的字典序排序,如果英文名字相同,再按罗马数字从小到大的顺序排序。  

罗马数字表示可以参考 https://en.wikipedia.org/wiki/Roman_numerals 中的"standard forms"。

输入

第一行包含一个整数N,表示名字的总数。

以下N行每行包含一个名字。英文名字与罗马数字之间由一个空格隔开。其中英文名字首字母是大写字母,其余字母是小写字母。  

对于100%的数据,1 ≤ N ≤ 100000, 罗马数字 < 4000

输出

输出N行,每行一个名字。

样例输入
5  
Elizabeth II  
Elizabeth C 
William IV  
Hiho MMXVII  
Hiho MMXVII 
样例输出
Elizabeth II
Elizabeth C
Hiho MMXVII  
Hiho MMXVII    
William IV

思路分析:

一道排序题目,设计字符串字典序比较,罗马数字转化为阿拉伯数字。偶然遇见了一个写的很棒的代码,默默的贴到我的blog上。感谢http://hihocoder.com/user/1731 大佬

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Scanner;


class Name implements Comparable<Name>{
String name,romanId;
int id;
Name(String name,String romanId){
this.name = name;
this.romanId = romanId;
id = romanToInt(romanId);
}


int romanToInt(String s){
int nums[] = new int[s.length()];
for(int i=0;i < s.length();i++){
switch (s.charAt(i)){
case 'M':
nums[i] = 1000;
break;
case 'D':
nums[i] = 500;
break;
case 'C':
nums[i] = 100;
break;
case 'L':
nums[i] = 50;
break;
case 'X':
nums[i] = 10;
break;
case 'V':
nums[i] = 5;
break;
case 'I':
nums[i] = 1;
break;
}
}
int sum = 0;
for(int i=0;i < nums.length-1;i++){
if(nums[i] < nums[i+1]){
sum -= nums[i];
}else{
sum += nums[i];
}
}
return sum + nums[nums.length - 1];
}
@Override
public String toString(){
return name + " "+ romanId; 
}
@Override
public int compareTo(Name n){
if(name.compareTo(n.name) < 0) return -1;
if(name.compareTo(n.name) > 0) return 1;
if(id < n.id) return -1;
if(id == n.id) return 0;
return 1;
}
}
public class Main{
public static void main(String[] args){
Scanner in = new Scanner(System.in);
int n = in.nextInt();
List<Name> aList = new ArrayList<Name>();
for(int i=0;i < n;i++){
aList.add(new Name(in.next(),in.next()));
}
Collections.sort(aList,null);
for(Name name: aList){
System.out.println(name);
}
}
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值