5747. 将字符串拆分为递减的连续值

题目链接:https://leetcode-cn.com/problems/splitting-a-string-into-descending-consecutive-values/

思路:每次截取一段“符合题目条件”的字符串(第一段不用,当然第一段数过大也需要break),然后从当前位置往后递归即可。由于判断的时候需要判断相邻相差1,因为不能用大数,所以我们就判断是不是>100L*Integer.MAX_VALUE即可,也不一定是这个数,只要满足不可能出现下一个与当前数相差是1的数即可(原因是为了防止越界Long,也是剪枝)。剪枝:(1)判断是不是>100L*Integer.MAX_VALUE,大于直接返回,不大于继续执行循环体 (2)判断相邻的差,小于0直接返回,等于1继续递归,大于1继续执行循环体

上代码:

class Solution {
   public boolean splitString(String s) {
        if (s.length() <= 1) {
            return false;
        }
        boolean flag = false;
        for (int i = 0; i < s.length() - 1; i++) {
            String substring = s.substring(0, i + 1);
            if (Long.parseLong(substring) > 100L * Integer.MAX_VALUE) {
                break;
            }
            flag = dfs(substring, i + 1, s);
            if (flag) {
                break;
            }
        }
        return flag;
    }

    public boolean dfs(String str, int index, String s) {
        if (index == s.length()) {
            return true;
        }
        for (int i = index; i < s.length(); i++) {
            String substring = s.substring(index, i + 1);
            if (Long.parseLong(substring) > 100L * Integer.MAX_VALUE) {
                return false;
            }
            long x = Long.parseLong(str) - Long.parseLong(substring);
            if (x < 0L) {
                return false;
            }
            if (x == 1L && dfs(substring, i + 1, s)) {
                return true;
            }
        }
        return false;
    }
}

 

一、实验目的 针对本章及前几章关于控制语句的学习,开发一个微波炉定时器,运用循环嵌套等语句,对程序中容易出错的内容进行练习,通过上机实验可以考察同学对知识点的掌握情况,对代码的熟练程度。 1.掌握分支语句应用于字符串处理的方法。 2.学会利用循环控制语句 二、实验内容 通过模拟微波炉定时器,学习常用的流程控制语句 1、提示输入倒计时的时间,格式如05:30 2、对输入的时间进行合法性判断,要综合考虑多种情况 3、处理输入字符分割出分、秒 4、若输入格式合格,循环输出倒计时的时间。 三、函数介绍 1、split()函数 split() 是 Python 中字符串(str)对象的一个内置方法,用于将字符串按照指定的分隔符拆分成一个列表(list)。 用法:split()函数是字符串类型 (str) 的一个方法,它接受一个字符串作为分隔符,用于将原字符串分割成若干个子字符串,并返回一个包含分割结果的列表。 语法格式:string.split(separator, maxsplit) 其中,separator是分隔符,用于指定切割字符串的标志,默认为None,表示使用空格作为分隔符;maxsplit是可选参数,用于指定最大分割次数。返回的结果是一个字符串列表。 例:text = "Hello World\nPython\tProgramming" result = text.split() print(result) # 输出: ['Hello', 'World', 'Python', 'Programming'] 2、input函数 用法:input() 函数接受一个标准输入数据,返回为 string 类型。 特殊用法: A、带有提示词的使用input()函数(单变量输入) input('请输入一个数字:') B、结合使用split()使用input()函数(单个变量 接收 多变量输入),注意使用split()后,返回的是一个列表。 # 输入多个变量,用split()默认值进行元素分隔,分隔符为' '空格 a, b, c = input().split() print(a) print(b) print(c) 3、range函数 用法:range函数是Python中的内置函数,用于生成一系列连续的整数,一般用于for循环体中。 语法格式: range(start,end,step) 参数介绍: start:用于指定计数的起始值,可以省略不写,默认值为0。 end:用于指定计数的结束值(不包括该值),如果该值设置为6,那么循环数值为0、1、2、3、4、5。 step:步长,就是两个数字之间的间隔,可以省略(默认步长为1)。比如range(1,5),这里是两个参数,表示默认步长为1,那么循环数值为1、2、3、4。尤其注意:如果是三个参数,那么最后一个参数才表示为步长。 4、time.sleep() 用法:time.sleep用于给定时间内挂起(等待)当前线程的执行。 函数命名来源于英文单词time(时间)和sleep(睡眠)。 time使用时需要import,主要用于处理和时间相关的操作。 5、print() 用法:print(*objects, sep=' ', end='\n', file=sys.stdout, flush=False) 功能:将 "objects" 打印输出至 "file参数" 指定的文本流,以 "sep 参数"分隔开并在末尾加上 "end参数"。 "sep" 、 "end "、 "file" 和"flush" 必须以关键字参数的形式给出。 flush 关键字参数是在 python3.3 版后增加的。 特殊用法: A、print("\r有生命\n便有\t希望") #“\n”,表示换行 \t 制表符 \r 表示将光标的位置回退到本行的开头位置 B、print()数据的格式化输出: print("%02d"%(j)) #其中的"02"表示最小宽度为2,不足时在前面补0 解释:所有非关键字参数都会被转换为字符串,就像是执行了 str() 一样,并会被写入到流,以 “sep参数“ 且在末尾加上 “end参数“。 “sep参数“ 和 “end参数“都必须为字符串;它们也可以为 “None“,这意味着使用默认值。 如果没有给出 “objects参数“,则 print() 将只写入 “end参数“。 "file 参数"必须是一个具有 write(string) 方法的对象;如果参数不存在或为 None,则将使用 sys.stdout。 由于要打印的参数会被转换为文本字符串,因此 print() 不能用于二进制模式的文件对象。 对于这些对象,应改用 file.write(...)。输出是否缓存通常取决于 file,但如果 flush 关键字参数为 True,输出流会被强制刷新。 四、实验步骤分解 1、输入一个数字,循环倒序输出 2、循环嵌套练习:外层是分钟,内层是59秒的循环 3、字符串分割split,分割后返回的是列表,输入:3:30秒,输出分和秒 4、将以上功能整合: A、输入时间格式; B、分割成列表并分别赋给变量分和秒; C、倒计时循环输出秒; D、再循环输出分; 5、增加异常情况判断 6、输出优化:print函数可以加上 ’\r’ 和end=’’
10-12
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

心脏dance

如果解决了您的疑惑,谢谢打赏呦

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值