求字符串中最长连续递增的数字子串的长度

如题,给定一个字符串,求字符串中最长连续递增的数字子串的长度。
字符串全部由小写字母和数字组成。

  • 用例1:1234aa12345ab123456
    结果:6。 ps:最长连续递增的数字子串为123456
  • 用例2:bv1234aa412345ab341234567
    结果:7。 ps:最长连续递增的数字子串为1234567
  • 用例3:54345689bv12345cd2123545454789
    结果:6。 ps:最长连续递增的数字子串为345689

题解:
由上题描述可知,求字符串中最长连续递增的数字子串的长度。
所以可以直接定义一个计数长度的变量和计数最大长度的变量。
然后遍历字符串,如果当前的字符为数字的情况下,前一个字符如果为数字且小于当前数字,则计数长度+1。如果当前的字符为数字的情况下,前一个字符如果为数字且大于等于当前数字(或前一个字符不为数字),则更新计数最大长度且将计数长度重置为1.

完整代码如下:

package com.example.testlib1;

import java.util.ArrayList;
import java.util.List;

public class Main {

    public static void main(String[] args) {
        String testStr1 = "1234aa12345ab123456";
        int len1 = maxLength(testStr1);
        System.out.println("len1:"+len1);

        String testStr2 = "bv1234aa412345ab341234567";
        int len2 = maxLength(testStr2);
        System.out.println("len2:"+len2);

        String testStr3 = "54345689bv12345cd2123545454789";
        int len3 = maxLength(testStr3);
        System.out.println("len3:"+len3);
    }

    public static int maxLength(String testStr) {
        // 将字符串转为字符数组方便遍历 
        char[] arr = testStr.toCharArray();
        // 定义变量,计数最大长度
        int max = 0;
        // 定义变量,计数当前长度
        int len = 0;
        List<Integer> list = new ArrayList<>();
        // 如果字符数组的第一个元素为数字,则计数+1.  方便后续遍历字符数组时索引从1开始
        if(Character.isDigit(arr[0])) {
            len ++;
        }
		// 遍历字符数组时,索引从1开始,避免i-1小于0的情况。
        for(int i=1;i<arr.length;i++) {
            if(Character.isDigit(arr[i])) {
            	// 如果当前的字符为数字的情况下,前一个字符如果为数字且小于当前数字,
            	// 则计数长度+1. 
            	// 如果当前的字符为数字的情况下,前一个字符如果为数字且大于等于当前数字(或前一个字符不为数字),
            	// 则更新计数最大长度且将计数长度重置为1.
                if (Character.isDigit(arr[i-1]) && arr[i]>arr[i-1]) {
                    len++;
                } else {
                    max = Math.max(max, len);
                    len = 1;
                }
            }
        }
        // 遍历完毕后,处理最后一次计数的情况
        if (len != 0) {
            max = Math.max(max, len);
        }
        return max;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值