【华为OD题库-016】字符串摘要-Java

题目

给定一个字符串的摘要算法,请输出给定字符串的摘要值

1、去除字符串中非字母的符号

2、如果出现连续字符(不区分大小写),则输出:该字符(小)+连续出现的次数

3、如果是非连续的宁符(不区分大小写),则输出:该字符(小写)该字母之后字符串中出现的该字符的次数

4、对按照以上方式表示后的字符串进行排序:字母和紧随的数字作为一组进行排序,数字大的在前,数字相同的则按字母进行排序,字母小的在前。
输入描述:

行字符串,长度为[1,200]
输出描述:

摘要字符串
示例1
输入:

aabbcc
输出:

a2b2c2
示例2
输入:

bAaAcBb
输出:

a3b2b2c0
说明:

第一个b非连续字母,该字母之后字符串中还出现了2次(最后的两个Bb),所以输出b2。a连续出现3次,输出a3,c非连续,该字母之后字符串再没有出现过c,输出c0,Bb连续2次,输出b2

对b2、a3、c0、b2进行排序,最终输出a3b2b2c0

思路

字符串处理的简单题,大致过程如下:

遍历字符串,利用Character.isAlphabetic©,过滤掉非字母符号

将字符串转为小写

遍历处理后的字符串,固定首位(i=0),判断i位置的字符是否为连续字符:

如果是连续字符,计算连续字符的个数,并将结果拼接为字符串(字符+连续次数)存入集合res中

如果是非连续字符,计算字符串后面出现该字符的次数,将结果拼接为字符串(字符+后面的子字符串出现该字符的次数),存入集合res中

最后对res排序即可(按出现次数从小到大)

题解

java 复制代码
package hwod;

import java.util.*;

public class StringAbstract {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String input = sc.nextLine();
        System.out.println(stringAbstract(input));
    }

    private static String stringAbstract(String input) {
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < input.length(); i++) {
            if (Character.isAlphabetic(input.charAt(i))) {
                sb.append(input.charAt(i));
            }
        }
        String pureString = sb.toString().toLowerCase();

        char[] chars = pureString.toCharArray();
        List<String> res = new ArrayList<>();
        for (int i = 0; i < chars.length; i++) {
            if (i + 1 < chars.length && chars[i + 1] == chars[i]) {
                //连续字符
                int k = i + 1;
                while (k < chars.length && chars[k] == chars[i]) k++;
                res.add(String.valueOf(chars[i]) + (k - i));
                i = k - 1;
            } else {
                //非连续字符
                int cnt = getNum(pureString.substring(i + 1), chars[i]);
                res.add(String.valueOf(chars[i]) + cnt);
            }
        }
        res.sort((str1, str2) -> {
            int n1 = str1.charAt(1) - '0';
            int n2 = str2.charAt(1) - '0';
            if (n1 != n2) return n2 - n1;
            return str1.charAt(0) - str2.charAt(0);
        });
        sb = new StringBuilder();
        for (int i = 0; i < res.size(); i++) {
            sb.append(res.get(i));
        }
        return sb.toString();
    }

    private static int getNum(String str, char c) {
        if (str == null || str.length() == 0) return 0;
        int res = 0;
        for (int i = 0; i < str.length(); i++) {
            if (str.charAt(i) == c) res++;
        }
        return res;
    }
}

推荐

如果你对本系列的其他题目感兴趣,可以参考华为OD机试真题及题解(JAVA),查看当前专栏更新的所有题目。

相关推荐
Sam-August27 分钟前
【分布式架构实战】Spring Cloud 与 Dubbo 深度对比:从架构到实战,谁才是微服务的王者?
java·spring cloud·dubbo
塔中妖27 分钟前
【华为OD】查找接口成功率最优时间段
算法·链表·华为od
塔中妖31 分钟前
【华为OD】最大子矩阵和
算法·华为od·矩阵
麦兜*36 分钟前
MongoDB 常见错误解决方案:从连接失败到主从同步问题
java·数据库·spring boot·redis·mongodb·容器
ytadpole1 小时前
揭秘设计模式:命令模式-告别混乱,打造优雅可扩展的代码
java·设计模式
用户3721574261351 小时前
Java 教程:轻松实现 Excel 与 CSV 互转 (含批量转换)
java
叫我阿柒啊2 小时前
Java全栈开发实战:从基础到微服务的深度解析
java·微服务·kafka·vue3·springboot·jwt·前端开发
凯尔萨厮2 小时前
Java学习笔记三(封装)
java·笔记·学习
霸道流氓气质2 小时前
Java开发中常用CollectionUtils方式,以及Spring中CollectionUtils常用方法示例
java·spring
失散132 小时前
分布式专题——5 大厂Redis高并发缓存架构实战与性能优化
java·redis·分布式·缓存·架构