• 21天学习挑战赛--字符串切割


    活动地址:CSDN21天学习挑战赛

    题目描述

    给定一个非空字符串S,其被N个‘-’分隔为N+1个的字串,给定正整数K,要求除第一个子串外,其余的子串每K个字符组成新的子串,并用‘-’分隔。对于新组成的每一个子串,如果它含有的小写字母比大写字母多,则将这个子串的所有大写字母转换为小写字母;反之,如果它含有的大写字母比小写字母多,则将这个子串的所有小写字母转换为大写字母;如果大小写字母数量一样多则不做转换。

    输入示例

    3

    12abc-abCABc-4aB@

    输出

    12abc-abc-ABC-4aB-@

    说明

    子串为12abc、abCABc、4aB@,除去第一个子串,剩余的按照3个字符分隔,则新的子串为12abc、abC、ABc、4aB、@,然后各个子串计算大小写字母个数转换大小写,则变为12abc、abc、ABC、4aB、@,最后由‘-’拼接得到结果。

    思考分析

    根据题目可以知道基本可以分为以下两个处理步骤

    • 按照特定正整数K切割除去第一个字串外的字串,得到新的字串;
    • 每个字串计算大小写字母数量,将所有字母转换为数量多的大小写。

    代码处理

    那么问题就变简单了,第一个问题:按照定长切割字符串。

    	public String split(String str, int n) {
            //子串长度
            int len = str.length();
            //长度不够,直接返回
            if (len <= n)
                return str;
            //第一次切割
            String res = str.substring(0,n);
            //定义切割起始位置
            int start = n;
            while (start < len) {
                //定义切割末尾位置,避免超出子串长度
                int end = Math.min(start + n, len);
                //切割并拼接
                res += "-" + str.substring(start, end);
                //下次切割位置
                start = end;
            }
    
            return res;
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    其中需要注意的就是切割避免超出子串长度,然后就是循环边界的定义。

    接下来解决第二个问题,计算大小写字母数量,并转换大小写。

    	public String change(String str) {
            int len = str.length();
            //记录大小写字母数量
            int a,b;
            a = b = 0;
            for (int i=0;i<len;i++) {
                char c = str.charAt(i);
                //大小写字母计数
                if (c >= 'a' && c <= 'z')
                    a ++;
                else if (c >= 'A' && c <= 'Z')
                    b ++;
            }
            //大小写字母转换
            if (a > b) {
                return str.toLowerCase();
            }else if (b > a) {
                return str.toUpperCase();
            }
            return str;
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    接下来就是将两个方法结合一下就可以了。

    	public static void main(String[] args) {
            String str = "12abc-acBACbd-QcGbAc@";
            int n = 3;
            //按照分隔符切割
            String[] s1 = str.split("-");
            String s = s1[0];
            for (int i=1;i<split.length;i++) {
                //定长切割
                s += "-" + split(s1[i], n);
            }
    
            //按照分隔符切割
            String[] s1 = s.split("-");
            //大小写字母转换
            String res = change(s1[0]);
            for (int i=1;i<s1.length;i++){
                res += "-" + change(s1[i]);
            }
    
            //打印结果
            System.out.println(res);
    
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    这里用了两个循环处理,有点消耗性能,其实可以优化调整为一个循环实现。
    原文地址

  • 相关阅读:
    Go 语言 iota 的神奇力量
    数据安全与个人隐私:美国人的焦虑与变化
    数据分析 - 概率计算
    算法通关村第九关|黄金挑战|有序数组转为二叉搜索树&寻找两个正序数组的中位数
    小程序代码管理
    LwIP笔记01:LwIP入门
    c#调用CUDA执行YOLOV5对象检测
    Spring AOP 的使用
    凯文凯利10条人生建议,送给迷茫的你!(上)
    Alibaba Cloud Linux 3.2104 LTS 64位 怎么安装python3.10.12和pip3.10
  • 原文地址:https://blog.csdn.net/yeah_you_are/article/details/126151124