字符串大小写分开打印 -- 漫漫算法路 刷题篇

本文介绍了一种不使用额外空间将字符串中的大写字母移到末尾的方法,提供了两种实现方案:一种通过两次遍历分别输出小写和大写字母;另一种利用Java的replaceAll函数简化操作。

小Q最近遇到了一个难题:把一个字符串的大写字母放到字符串的后面,各个字符的相对位置不变,且不能申请额外的空间。
你能帮帮小Q吗?

输入描述:

输入数据有多组,每组包含一个字符串s,且保证:1<=s.length<=1000.

输出描述:
对于每组数据,输出移位后的字符串。
示例1

输入

AkleBiCeilD

输出

kleieilABCD
解法一 :遍历两次字符串  第一次打印小写字母  第二次打印大写字母

import java.util.*;

public class Main{
    public static void main(String arg[]){
        Scanner sc = new Scanner(System.in);
        while(sc.hasNext()){
            String str = sc.nextLine().trim();
            for(int i=0;i<str.length();i++){
                if(str.charAt(i)>='a'&&str.charAt(i)<='z'){
                System.out.print(str.charAt(i));
            }
            }
            for(int j=0;j<str.length();j++){
                if(str.charAt(j)>='A'&&str.charAt(j)<='Z'){
                System.out.print(str.charAt(j));
                }
            }
            System.out.print("\n");
        }
        sc.close();
    }

}

解法二:不用遍历  直接使用replaceAll函数  

import java.util.*;
public class Main{
    public static String getResult(String str){
        return str.replaceAll("[A-Z]","")+str.replaceAll("[a-z]","");
    } 
    public static void main(String arg[]){
        Scanner sc = new Scanner(System.in);
        while(sc.hasNext()){
            String str = sc.nextLine().trim();
            System.out.println(getResult(str));
        }
        sc.close();
    }
}

<think> 我们需要创建一个Java枚举来表示不同的LLM引擎。根据需求,我们可能有三种类型:CHATGPT, GEMINI, 以及可能的DEFAULT(但根据描述,default是一个兜底的值,通常是chatgpt,但枚举值应该独立,所以我们可以将枚举值设计为CHATGPT和GEMINI,而default在逻辑中处理,但枚举需要包含所有可能的引擎)。 根据白名单配置,我们有两个引擎:chatgpt和gemini。因此,枚举应该包括这两个,同时考虑到未来可能扩展其他引擎,我们可以设计一个通用的枚举。 枚举名称:LlmEngine 枚举值: - CHATGPT - GEMINI 注意:配置中的字符串(如"chatgpt")需要与枚举值对应。我们可以在枚举中添加一个属性来保存配置中的字符串表示,并提供从字符串解析的方法。 步骤: 1. 定义枚举,包含CHATGPT和GEMINI。 2. 为每个枚举值添加一个属性(比如字符串形式的名称),通过构造方法初始化。 3. 提供一个静态方法,根据字符串名称获取对应的枚举值。如果字符串不匹配任何枚举,可以返回null,或者根据需求返回默认值(比如CHATGPT)。但注意,在业务逻辑中,如果解析不到,我们可能使用default配置(即chatgpt),所以在解析方法中,我们可以返回null,然后由调用方决定使用默认值。 但是,根据需求,我们可能还需要处理大小写,配置中是小写,所以我们在解析时忽略大小写。 另外,根据配置,default字段是字符串,所以我们需要一个方法将字符串转换成枚举。 设计如下: ```java public enum LlmEngine { CHATGPT("chatgpt"), GEMINI("gemini"); private final String name; LlmEngine(String name) { this.name = name; } public String getName() { return name; } public static LlmEngine fromName(String name) { if (name == null) { return null; } for (LlmEngine engine : values()) { if (engine.name.equalsIgnoreCase(name)) { return engine; } } return null; } } ``` 这样,我们就可以根据配置中的字符串来获取枚举值了。 注意:在业务逻辑中,如果从配置中读取的字符串无法解析为枚举,则使用default字段(即"chatgpt")对应的枚举,所以我们可以这样使用: ```java String configValue = ...; // 从配置中读取的字符串 LlmEngine engine = LlmEngine.fromName(configValue); if (engine == null) { // 使用默认值 engine = LlmEngine.CHATGPT; } ``` 另外,考虑到配置中还有白名单百分比范围,以及账户ID白名单,这些是业务逻辑处理的,枚举本身不包含这些信息。 现在,根据要求,我们输出枚举的Java代码。 </think>根据需求,我将创建一个表示LLM引擎的Java枚举类型。该枚举需对应配置中的`chatgpt`和`gemini`值,并提供安全解析方法: ```java public enum LlmEngine { CHATGPT("chatgpt"), GEMINI("gemini"); private final String configName; LlmEngine(String configName) { this.configName = configName; } /** * 根据配置名称安全解析枚举值 * @param configName 配置中的小写字符串 * @return 匹配的枚举值,未匹配时返回null */ public static LlmEngine fromConfig(String configName) { if (configName == null) return null; for (LlmEngine engine : values()) { if (engine.configName.equalsIgnoreCase(configName.trim())) { return engine; } } return null; } /** * 获取配置中使用的名称 */ public String getConfigName() { return configName; } } ``` ### 使用说明 1. **枚举值**:直接对应配置中的引擎名称 2. **安全解析**:通过`fromConfig()`方法将JSON配置的字符串转换为枚举 3. **兜底逻辑**:当解析返回`null`时,使用`default`配置值 4. **配置映射**:`getConfigName()`获取枚举在JSON中的原始名称
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值