当前位置: 首页 > article >正文

豆包MarsCode:小T的密码变换规则

问题描述

在这里插入图片描述


思路分析

1. 输入输出

  • 输入:一个字符串 s,其中可能包含字母、数字和其他符号。
  • 输出:一个字符串,代表输入字符串按规定转换后的数字密码。

2. 转换规则分析

根据题目描述,密码转换的规则如下:

  • 小写字母 (az): 每个小写字母都对应一个特定的数字。

    • 比如:a, b, c 转换为 2d, e, f 转换为 3 等。
  • 大写字母:

    • 首先将大写字母转换为小写。
    • 然后,如果该小写字母不是 a,我们将其转为字母表中的前一个字母,再进行数字转换。
    • 特殊情况:A 被转换为 Z,然后转换为数字 9
  • 非字母字符:保持不变。

3. 解决方案分析

为了解决这个问题,我们的任务是逐一处理字符串中的每个字符。针对不同类型的字符,我们做不同的处理:

  • 对于小写字母:直接映射到对应的数字。
  • 对于大写字母:需要将其转换为小写字母,再进行相应的前一个字母转换,并映射到数字。
  • 对于其他字符:直接将其添加到结果字符串中。

4. 步骤拆解

根据以上规则,我们可以将解题步骤拆解为以下几个部分:

  1. 遍历字符串中的每个字符:对每个字符进行判断,分别处理不同类型的字符(小写、大写、非字母)。
  2. 字符转换
    • 小写字母:直接根据字母转换为对应的数字。
    • 大写字母:转换为小写字母,再找出前一个字母并转换为数字。特殊处理大写字母 A
  3. 构建结果字符串:对于每个字符,根据处理结果更新字符串。

5. 算法实现

具体的算法可以按照以下方式实现:

  1. 字符遍历:遍历输入字符串的每个字符。
  2. 字符转换逻辑
    • 如果是小写字母,直接转换为数字。
    • 如果是大写字母,特殊处理 A,其他大写字母先转为小写字母的前一个字母,再转换为数字。
    • 非字母字符直接保持不变。
  3. 最终结果:通过 StringBuilder 存储最终的转换结果,并返回。

6. 关键函数和工具

  • Character.isLowerCase(c):判断字符 c 是否是小写字母。
  • Character.isUpperCase(c):判断字符 c 是否是大写字母。
  • Character.toLowerCase(c):将大写字母转换为小写字母。
  • StringBuilder:高效地构建最终的结果字符串。

7. 边界情况

需要注意的一些边界情况:

  • 处理非字母字符时,直接添加到结果中,不需要进行任何处理。
  • 特殊情况:A 转换为 Z 后再转换为 9

8. 总结

整个过程可以分为:

  • 遍历字符串中的每个字符。
  • 对字符进行判断并转换:
    • 小写字母按规则转换;
    • 大写字母先转换为小写字母,再跳到前一个字母进行转换,A 特殊处理;
    • 非字母字符直接添加到结果中。
  • 最终通过 StringBuilder 构建并返回结果字符串。

参考代码(Java)

public class Main {
    public static String solution(String s) {
        StringBuilder result = new StringBuilder(); // 用于构建结果字符串
        
        for (char c : s.toCharArray()) {
            if (Character.isLowerCase(c)) {
                // 小写字母按规则转换
                result.append(getDigit(c));
            } else if (Character.isUpperCase(c)) {
                // 大写字母先转换为小写字母的前一个字母
                if (c == 'A') {
                    // 特殊处理 A -> Z
                    result.append(getDigit('z'));
                } else {
                    // 其他大写字母转换为小写字母的前一个字母
                    char prevChar = (char) (Character.toLowerCase(c) - 1);
                    result.append(getDigit(prevChar));
                }
            } else {
                // 非字母字符直接添加
                result.append(c);
            }
        }
        
        return result.toString();
    }
    
    // 根据字母获取对应的数字
    private static char getDigit(char c) {
        switch (c) {
            case 'a': case 'b': case 'c':
                return '2';
            case 'd': case 'e': case 'f':
                return '3';
            case 'g': case 'h': case 'i':
                return '4';
            case 'j': case 'k': case 'l':
                return '5';
            case 'm': case 'n': case 'o':
                return '6';
            case 'p': case 'q': case 'r': case 's':
                return '7';
            case 't': case 'u': case 'v':
                return '8';
            case 'w': case 'x': case 'y': case 'z':
                return '9';
            default:
                return '0'; 
        }
    }

    public static void main(String[] args) {
        System.out.println(solution("LIming0701").equals("5464640701"));
        System.out.println(solution("PassW0rd").equals("62778073"));
        System.out.println(solution("helloWORLD123").equals("4355686752123"));
    }
}

代码分析

1. solution 方法

public static String solution(String s) {
    StringBuilder result = new StringBuilder(); // 用于构建结果字符串
    
    for (char c : s.toCharArray()) {
        if (Character.isLowerCase(c)) {
            // 小写字母按规则转换
            result.append(getDigit(c));
        } else if (Character.isUpperCase(c)) {
            // 大写字母先转换为小写字母的前一个字母
            if (c == 'A') {
                // 特殊处理 A -> Z
                result.append(getDigit('z'));
            } else {
                // 其他大写字母转换为小写字母的前一个字母
                char prevChar = (char) (Character.toLowerCase(c) - 1);
                result.append(getDigit(prevChar));
            }
        } else {
            // 非字母字符直接添加
            result.append(c);
        }
    }
    
    return result.toString();
}
分析:
1. StringBuilder result = new StringBuilder();
  • StringBuilder 用于高效地构建一个字符串。在循环中不断拼接字符,最后通过 toString() 方法返回最终结果。
  • StringBuilder 相比普通的 String 拼接,在性能上有显著提升,尤其是在处理大量字符时。
2. for (char c : s.toCharArray()) { ... }
  • s.toCharArray() 将字符串 s 转换为字符数组,然后通过 for-each 循环逐个处理数组中的字符。
  • 对于每个字符 c,根据它的类型进行判断和处理。
3. if (Character.isLowerCase(c)) { ... }
  • 判断小写字母Character.isLowerCase(c) 用于检查字符 c 是否为小写字母。
  • 如果是小写字母,就直接调用 getDigit(c) 方法,将字母 c 转换成对应的数字,然后将结果添加到 StringBuilder 中。
4. else if (Character.isUpperCase(c)) { ... }
  • 判断大写字母Character.isUpperCase(c) 用于检查字符 c 是否为大写字母。

  • 如果是大写字母,首先需要进行特殊处理:

    • 如果字母是 A,则将其转换为 Z 并处理为数字 9
    • 如果是其他大写字母,则将其转换为小写字母,再跳到前一个字母(即字母表中前一个字母),然后按规则转换为对应的数字。
  • 例如:B -> b -> a -> 2C -> c -> b -> 2

5. else { result.append(c); }
  • 非字母字符:对于非字母字符(如数字或符号),直接将其添加到 StringBuilder 中,不需要转换。
6. return result.toString();
  • 最后,StringBuilder 的内容通过 toString() 方法转换为一个字符串,并返回这个字符串作为结果。

2. getDigit 方法

private static char getDigit(char c) {
    switch (c) {
        case 'a': case 'b': case 'c':
            return '2';
        case 'd': case 'e': case 'f':
            return '3';
        case 'g': case 'h': case 'i':
            return '4';
        case 'j': case 'k': case 'l':
            return '5';
        case 'm': case 'n': case 'o':
            return '6';
        case 'p': case 'q': case 'r': case 's':
            return '7';
        case 't': case 'u': case 'v':
            return '8';
        case 'w': case 'x': case 'y': case 'z':
            return '9';
        default:
            return '0'; // 不应该有默认情况,但为了避免错误添加
    }
}
分析:
1. switch (c)
  • getDigit 方法根据字符 c 来返回对应的数字。
  • 使用 switch 语句来对字母进行分类,每个字母都对应一个特定的数字。比如,a, b, c 都转换为 2d, e, f 都转换为 3 等等。
2. 字符到数字的映射
  • switch 语句确保每个字母对应的数字被正确地返回。例如:
    • 'a', 'b', 'c' 对应 '2'
    • 'd', 'e', 'f' 对应 '3'
    • … 以此类推。
3. default 分支
  • 该分支在逻辑上不应该被执行,因为 c 必定是一个字母,且在 switch 语句中已经进行了完整的匹配。
  • 这里的 return '0' 作为安全措施,以防万一遇到没有在 switch 中处理的字符(尽管题目要求中不涉及其他情况)。

http://www.kler.cn/a/448101.html

相关文章:

  • Java基于SSM框架的无中介租房系统小程序【附源码、文档】
  • 36. Three.js案例-创建带光照和阴影的球体与平面
  • ASP.NET|日常开发中数据集合详解
  • 你好Python
  • MacPorts 中安装高/低版本软件方式,以 RabbitMQ 为例
  • @PostConstruct注解解释!!!!
  • RLDP(快速链路检测)防环
  • Rust vs C: PNG解码器性能之争的启示
  • Apple Vision Pro 开发教程:通过 TestFlight 把开发的程序安装到其他的设备上测试
  • C++算法第十二天
  • 一起学Git【番外篇:如何在Git中新建文件】
  • OpenCV图像分割
  • UITableView实现通讯录效果
  • 【漏洞-Oracle】未设置口令复杂度校验、密码有效期
  • ELK系列-(六)Redis也能作为消息队列?(上)
  • 使用Python实现量子密钥分发:构建安全通信的未来
  • scala基础学习(数据类型)-字符串
  • Oracle筑基篇-调度算法-LRU的引入
  • 【MogDB】MogDB5.2.0重磅发布第十篇-支持PLSQL嵌套子程序
  • React:组件、状态与事件处理的完整指南
  • 软件测试之边界值分析法
  • 【分享-POI工具,Excel字段取值容错小工具】
  • 基于Controller模式部署RocketMQ集群
  • 【蓝桥杯选拔赛真题96】Scratch风车旋转 第十五届蓝桥杯scratch图形化编程 少儿编程创意编程选拔赛真题解析
  • tomcat的安装以及配置(基于linuxOS)
  • centos集群部署seata