UVALive 5739|User Names|模拟

31 篇文章 0 订阅

一个大学电脑系统通过下面的规则确定学生的用户名:
1. 用户名长度不超过 MAXLEN 个字符。
2. 用户名第一个字符为这个人的first name,转换成小写,忽略非字母的字符
3. 把这个人的last name加到用户名后面(小写),如果超出 MAXLEN ,只保留前 MAXLEN 个字符。
4. 如果规则1~3产生的用户名在数据库中已经存在,若用户名长度为 MAXLEN ,则用户名后面删去最后1个字符,加0~9(按顺序),以保证长度不会超过 MAXLEN ;否则直接加0~9。
5. 如果规则1~4产生的用户名在数据库中已经存在,若用户名长度为 MAXLEN MAXLEN1 ,则用户名后面删去最后几个字符,加10~99(按顺序),以保证长度不会超过 MAXLEN ;否则直接加10~99。
6. 假设上述规则能覆盖所有输入情况。

输入

输入有多组数据,对于每组数据,第一行2个正整数 n(n200) MAXLEN 。接下来 n 行,每行一个学生的姓名,不超过80个字符。first name, middle name, last name用空格隔开。大小写和符号不定。
n=MAXLEN=0表示输入结束。

输出

对于每组数据,第一行包含数据组序号,接下来几行每行一个用户名,对应输入的学生姓名。

样例输入

2 6
Jenny Ax
Christos H Papadimitriou
11 8
Jean-Marie d’Arboux
Jean-Marie A d’Arboux
Jean-Marie B d’Arboux
Jean-Marie C d’Arboux
Jean-Marie D d’Arboux
Jean-Marie D d’Arboux
Jean-Marie F d’Arboux
Jean-Marie G d’Arboux
Jean-Marie H d’Arboux
Jean-Marie I d’Arboux
Jean-Marie J d’Arboux
11 9
Jean-Marie d’Arboux
Jean-Marie A d’Arboux
Jean-Marie B d’Arboux
Jean-Marie C d’Arboux
Jean-Marie D d’Arboux
Jean-Marie D d’Arboux
Jean-Marie F d’Arboux
Jean-Marie G d’Arboux
Jean-Marie H d’Arboux
Jean-Marie I d’Arboux
Jean-Marie J d’Arboux
0 0

样例输出

Case 1
jax
cpapad
Case 2
jdarboux
jdarbou1
jdarbou2
jdarbou3
jdarbou4
jdarbou5
jdarbou6
jdarbou7
jdarbou8
jdarbou9
jdarbo10
Case 3
jdarboux
jdarboux1
jdarboux2
jdarboux3
jdarboux4
jdarboux5
jdarboux6
jdarboux7
jdarboux8
jdarboux9
jdarbou10

题解

Java大法好

import java.util.*;
import java.util.stream.Collectors;

public class p5739 {
    public static void main(String[] args) throws Exception {
        Scanner scanner = new Scanner(System.in);

        int kase = 0;
        while (true) {
            int n = scanner.nextInt(), maxlen = scanner.nextInt();
            if (n == 0 && maxlen == 0) break;
            scanner.nextLine();
            HashSet<String> set = new HashSet<>();

            System.out.printf("Case %d\n", ++kase);

            while (--n >= 0) {
                String name = scanner.nextLine();
                String[] names = name.split(" ");
                String first = names[0];
                String last = names[names.length - 1];
                String original = new StringBuilder().appendCodePoint(first.toLowerCase().chars()
                        .filter(Character::isAlphabetic)
                        .findFirst().getAsInt())
                        .append(last.toLowerCase().codePoints().filter(Character::isAlphabetic).collect(StringBuilder::new,
                        StringBuilder::appendCodePoint, StringBuilder::append)
                        .toString()).toString();

                if (original.length() > maxlen)
                    original = original.substring(0, maxlen);
                String ans = original;

                int len = 1, roll = 0, sq = 1;
                while (set.contains(ans)) {
                    ++roll;
                    if (roll >= sq * 10) {
                        ++len; sq *= 10;
                    }

                    if (maxlen - len > original.length())
                        ans = original + roll;
                    else
                        ans = original.substring(0, maxlen - len) + roll;
                }
                set.add(ans);
                System.out.println(ans);
            }
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值