python_lintcode_718重复字串_706二进制时间

718重复字串

题目

http://www.lintcode.com/zh-cn/problem/repeat-string/

写一个方法, 给一个由 N 个字符构成的字符串 A和一个由 M 个字符构成的字符串 B, 返回 A 必须重复的次数,使得 B 是重复字符串的子串.如果 B 不可能为重复字符串的子串, 则返回 -1.

注意事项

假设 1 <= N, M <= 1000

样例
给出 A = abcd, B = cdabcdab
你的方法需要返回 3, 因为在重复字符串 A 3次之后我们得到了字串 abcdabcdabcd. 字符串B是这个字符串的一个子串.

思路

  • python内的字符串直接用x in y:就可以直接判断x是否在字符串y内。
  • 根据1 <= N, M <= 1000,只要复制到1001次,则大致可知是否能存在重复字符串

代码

class Solution:
    """
    @param: : string A to be repeated
    @param: : string B
    @return: the minimum number of times A has to be repeated
    """

    def repeatedString(self, A, B):
        # write your code here
        c_num = 1
        jia = A
        while B not in  A:
            A = A +jia
            c_num +=1
            if c_num >1000:
                return -1
        return c_num

706二进制时间

题目

http://www.lintcode.com/zh-cn/problem/binary-time/

给了一个二进制显示时间的手表和一个非负整数 n, n 代表在给定时间表上 1 的数量, 返回所有可能的时间

注意事项

输出的顺序没有要求.
小时不能包含前导零, 比如 “01:00” 是不允许的, 应该为 “1:00”.
分钟必须由两位数组成, 可能包含前导零, 比如 “10:2” 是无效的, 应该为 “10:02”.

样例
给出 n = 1
返回 [“1:00”, “2:00”, “4:00”, “8:00”, “0:01”, “0:02”, “0:04”, “0:08”, “0:16”, “0:32”]

思路

  • 用一个字典存放所以的小时(0-11)和分钟(0-59)所需要表示成二进制需要的1的数量。
我们知:二进制与10进制关系
    64 32 16 8 4 2 1
    1  1   1 1 1 1 1 
其中字典的建立有规律性
10进制:0 1 2 3 4 5 6 7
二进制:0 1 1 2 1 2 2 3 

10进制:8 9 10 11 12 13 14  15 
二进展:1 2  2  3  2  3  3  4  
其实9-15就是8去加前面十进制(0-7)需要的二进制数
9 =8+1 =1+1=2
10=8+2 =1+1=2
11=8+3 =1+2=3
......
后面的都类同17-31 =>16+
            33-60 =>32+
  • 其实也可以使用十进制转为二进制所要的1数量来建立字典,只是一开始想的是上面这个规律来建。
  • 根据所给的n(1的数量),先循环小时,减去所需的1的数量,剩下的1在分钟里面找,其中需要判断分钟是否小于10的,小于10的需要前置0.

代码

class Solution:
    """
    @param: : the number of "1"s on a given timetable
    @return: all possible time
    """

    def binaryTime(self, n):
        # Write your code here
        dict1 ={'0':0,'1':1,'2':1,'3':2,'4':1,'5':2,'6':2,'7':3}
        for i in range(8,12):
            dict1[str(i)]=dict1[str(i-8)]+1
        #dict2复制0-11小时
        dict2 = dict1.copy()
        #dict1是0-59分钟
        for i in range(12,16):
            dict1[str(i)]=dict1[str(i-8)]+1
        for i in range(16,32):
            dict1[str(i)]=dict1[str(i-16)]+1
        for i in range(32,60):
            dict1[str(i)]=dict1[str(i-32)]+1
        result = []
        for i in dict2:
            res=''
            #小时
            if dict2[i]<=n:
                res=res+i+':'
                #分钟
                for j in dict1 :
                    if (n-dict2[i]) == dict1[j]:
                    #小于10的需要补充前置0
                        if  int(j)<10:
                            result.append(res+'0'+j)
                        else:
                            result.append(res+j)
        return result
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值