CS61A Lab 3: Midterm Review Q3

整个lab3对于我来说Q3是难度最大的,所以我只放了这题的解析,使用语言python,其他题需要解析的可以联系,这个解题思路是自己想的,感觉可能也比较复杂,如果有更简便的算法,希望您能留言联系,以供学习,本人学识尚浅,首次发文,不喜勿喷。

Q3: K Runner

An increasing run of an integer is a sequence of consecutive digits in which each digit is larger than the last. For example, the number 123444345 has four increasing runs: 1234, 4, 4 and 345. Each run can be indexed from the end of the number, starting with index 0. In the example, the 0th run is 345, the first run is 4, the second run is 4 and the third run is 1234.

Implement get_k_run_starter, which takes in integers n and k and returns the 0th digit of the kth increasing run within n. The 0th digit is the leftmost number in the run. You may assume that there are at least k+1 increasing runs in n.

译文:递增序列是一个连续的数字序列,其中每一位都比最后一位大。例如,数字123444345有四个递增序列:1234、4、4和345。每次运行都可以从数字的末尾开始索引,从索引0开始。在这个例子中,第0次运行是345,第一次运行是4,第二次运行是4,第三次运行是1234。

实现get_k_run_starter,它接受整数n和k,并返回n内第k个递增运行的第0位数字。第0位数字是运行中最左边的数字。你可以假设在n中至少有k+1次增加的运行。

'''
解题思路是从输入数据n的右边开始逐个找出递增序列,然后把这个序列存进列表并在n中删除
循环这个步骤,就可以把n分成几个递增序列,之后再从列表中找到第k个序列并求他的首位数字
'''
def get_k_run_starter(n, k):
    def length(x):
        i=0
        while x!=0:
            x=x//10
            i+=1
        return i
    #定义一个函数用来求一个int数据的长度,最后一步才用到这个函数
    # 的位数大小初值设为1
    final=None
    #用final作为最后的返回值,定初值为None
    num2=n
    #num2是用来统计每次从n右边开始删掉一个递增数据后n剩余的数字,初始值是n
    # 例如n为123444345删掉一次后为123444
    my_list=[]
    #用来存放n这个数据的所有递增序列的列表
    '''
    拆分方法是判断右边数字是否比左边数字大如果是,就让i变量自增,当这个循环条件不满足之后
    之后用n%(10**i)就可以得到从n右边开始的第一个递增序列,然后把他加进列表,同时用变量
    num2来记录n//(10**i)得到把n从右边去掉此递增序列后的剩余数字,重复进行此操作以获得
    全部递增序列
    '''
    while n!=0:
        i=1
        # 这里的i是用来统计输入的int数据n从右边开始往左数的第一个递增序列(此序列下标0)
        while n % 10 > n % 100 // 10:
            #判断右边数字是否比左边数字
            i+=1
            n=n//10
            #每循环一次就让n的数字删除一位
        my_list.append(num2 % (10 ** i))
        num2=num2//(10**i)
        #num2 % (10 ** i)得到的是递增序列,num2//(10**i)得到的是去掉递增序列后的剩余数据
        n=n//10
        #在这里让n再次//10是因为循环执行了两次,意味着n//10了两次,但是i的值已经是3,所以
        #要再次//10来让数位匹配到刚删除完递增序列后的数字
        #这里的n和num2容易混淆,n的作用是让循环可以继续下去,num2则是用来提取递增序列
    print(my_list)
    final=my_list[k]//(10**(length(my_list[k])-1))
    #my_list[k]就是要求的那个递增序列,用开始定义的length函数求他的长度,
    # my_list[k]//(10**(length(my_list[k])-1))求首位数字
    return final
print(get_k_run_starter(123444345,0))

运行结果

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

idMiFeng

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值