CSDN竞赛第一期编程题小艺的英文名【双指针、字符串处理】

博客主页:JavaProfessional
一个专注于Java的博主,致力于使用通俗易懂的语句讲解内容,期待您的关注!

编程第一题:小艺的英文名

一、题目名称:小艺的英文名
时间限制:1000ms内存限制:256M
题目描述:
小艺酱想给自己起—个英文名字。小艺酱想要装的自己学识渊博。所以她想要自己英文名字必须满足:
1.只有字母表中前k个小写字母。
2必须是回文串。
3.前k个小写字母每个字母至少出现—次。
小艺酱已经自己完成了部分空余的字母部分用’?’代替。
请你帮她完成她的英文名字。
输入描述:
第一行输入一个整数k。(1第二行输入小艺酱的英文名字name。(1
输出描述:
如果小艺的名字不存在输出“QAQ",如果存在多组解,输出字典序最小的一个解。

示例

输入
2
a??a
输出
abba

思路:双指针

  1. 为了确保第1点和第3点,我们需要知道已经给出的字母中有哪些字母已经出现过,有哪些字母还没有出现过
  2. 为了保证回文串,我们可以从两端向中间处理,也可以从中间向两端处理。
  3. 题目中还有一点要求,如果存在多组解,我们要输出字典序最小的一个解,所以我们选择从中间向两端处理,当所有字母都已经出现过,其余?我们填充字典最小a即可满足。

代码:

public class Name {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        while (scanner.hasNextInt()) {
            Integer count = scanner.nextInt();
            scanner.nextLine();
            String template = scanner.nextLine();
            // 获取所有的字母
            List<Character> allCharacter = new LinkedList<>();
            for (Integer i = count - 1; i >= 0; i--) {
                allCharacter.add((char) ('a' + i));
            }
            List<Character> exist = new LinkedList<>();
            for (int i = 0; i < template.length(); i++) {
                exist.add(template.charAt(i));
            }
            // 剩下的就是需要至少出现一次的字母,已经倒序排好了
            allCharacter.removeAll(exist);
            int left = template.length() % 2 == 0 ? template.length() / 2 - 1 : template.length() / 2;
            int right =  template.length() / 2;
            //左右指针从中间开始倒序插入
            int index = 0;
            char[] newStr = new char[template.length()];
            while(left>=0 && right<template.length() && index<allCharacter.size()) {
                if (template.charAt(left)=='?' && '?' == (template.charAt(right))) {
                    newStr[left] = allCharacter.get(index);
                    newStr[right] = allCharacter.get(index);
                    index++;
                } else {
                    newStr[left] = template.charAt(left);
                    newStr[right] = template.charAt(right);
                }
                left--;
                right++;
            }
            // 所有的字母都用完了(已经满足了条件3),但是回文还没走到头,那么剩下的只需要都赋值为‘a’即可(这样满足最小字典序)
            while (left>=0 ||right<template.length()) {
                if (template.charAt(left)=='?' && '?' == (template.charAt(right))) {
                    newStr[left] = 'a';
                    newStr[right] = 'a';
                    index++;
                } else {
                    newStr[left] = template.charAt(left);
                    newStr[right] = template.charAt(right);
                }
                left--;
                right++;
            }
            // 序列都走到头了,字母还没用完,则不满足条件3
            if (index <allCharacter.size()) {
                System.out.println("QAQ");
                return;
            }
            System.out.println(new String(newStr));
        }
        scanner.close();
        return;
    }
}

结果

输入输出1

在这里插入图片描述
上图输入输出其实是一个最正常的结果。

输入输出2

在这里插入图片描述
上图输入输出其实是输入输出1的变形,我们把所有的字母都完美的用上了。

输入输出3

在这里插入图片描述
该用例是指字母多于空位,形不成回文

输入输出4

在这里插入图片描述
该用例恰好能形成回文。

输入输出5

在这里插入图片描述
该用例是验证最小字典序

输入输出6

在这里插入图片描述
该用例同样是验证最小字典序,且所给的字母小于?的个数。


好文推荐

  1. 通俗易懂JVM
  2. 为什么Spring中的IOC(控制反转)能够降低耦合性(解耦)?
  3. 效率翻倍,这些idea的逆天功能你知道吗?
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
字符串处理系统是一种计算机软件系统,用于对字符串进行各种操作和处理。它包括了字符串的输入、输出、查找、替换、分割、排序等功能,可以大大简化字符串处理的工作。 在设计字符串处理系统时,首先需要考虑系统的功能需求。根据实际应用场景和用户需求,确定系统需要支持哪些字符串操作功能,如查找指定字符串、替换指定字符串、截取子字符串等。同时,还要考虑系统的性能需求,保证系统能够快速、准确地处理大量的字符串数据。 在系统实现方面,可以采用面向对象的设计方法,将不同的字符串操作功能封装为不同的类。例如,可以设计一个字符串处理类,包含常见的字符串操作方法,如查找、替换、分割等。还可以设计一个字符串排序类,实现字符串的按字母顺序排序功能。 在具体实现过程中,需要使用合适的编程语言和工具。可以选择使用C++、Java等面向对象语言进行开发,并结合各种字符串处理库,如正则表达式库,来实现系统的功能。另外,为了保证系统的性能,可以采用多线程或并行计算的方式,提高系统的处理效率。 此外,还需要考虑系统的用户界面设计和交互方式。可以设计一个简洁、直观的用户界面,让用户可以方便地输入和输出字符串,并选择相应的操作功能。同时,可以提供命令行或图形界面等不同的交互方式,以满足不同用户的需求。 总之,字符串处理系统的设计与实现需要考虑功能需求、性能需求、编程语言与工具选择、用户界面设计等方面,以提供便捷、高效的字符串处理功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

tinpo_123

感谢给小张填杯java~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值