LeetCode中的一道编程题:
计算数字K在0-n中出现的个数,K可能是0~9中的一个值,如n=12,在[0,1,2,3,4,5,6,7,8,9,10,11,12]中我们发现1出现了5次,试编程返回个数。
下面是我的代码,测试出来的答案是152,但答案给的是161,而且没给源码,我百思不得其解。我的思路是:通过循环每取一个数就将其转化为字符串,通过strip()去掉要数的那个数k,前后长度之差就是这个数中所含k的个数
1 class Solution: 2 """ 3 @param: : An integer 4 @param: : An integer 5 @return: An integer denote the count of digit k in 1..n 6 """ 7 8 def digitCounts1(self, k, n): 9 # write your code here 10 count=0 11 12 13 def digitCounts(self, k, n): 14 # write your code here 15 count=0 16 for t in range(0,n+1): 17 L=len(str(t))-len(str(t).strip(str(k))) 18 count=count+L 19 return count 20 21 if __name__=='__main__': 22 tmp=Solution() 23 print(tmp.digitCounts(2,302))
觉得应该是答案给错了吧,将范围缩小些:
for t in range(0,n+1): print(t) print(tmp.digitCounts(2,20))
得到3,和打印出来的结果一致。
但是我找了个java的代码,跑出来的结果也是161...
其实我觉得我的思路没问题,python实现代码也没问题,不知你们怎么看,我感觉那个平台(LeetCode)有问题,不知你们有没有同感
@南方博客: 把代码在本地跑一遍,和线上的对比一下就知道是不是平台问题了。
@逐影: 我本地跑出来的和平台的不一样,但是我不是很干肯定我的一定是对的,所以我才来集思广益来着
@南方博客: 好像答案确实是161,是用正则匹配到的数字个数。
@逐影:果然,那试问我的问题出哪里了,我自己实在是找不出
@南方博客: strip方法用于移除字符串头尾指定的字符,但像这样的:
(120, 0)
(121, 0)
(122, 2)
(123, 0)
(124, 0)
(125, 0)
(126, 0)
(127, 0)
(128, 0)
(129, 0)
就匹配不到,所以漏算了。
可以print(t,L)把结果打印出来看一下。
呃呃,感觉泡脚的时候脑洞最大,刚验证了下,发现120~129之内的2均不能被strip()剥离,就是说strip()是剥离首位两端的匹配字符的,之前学的时候没有留心,还好早发现了
def CntSingle(str,strSub): ln = len(strSub) cnt = 0 for i in range(0, ln): if strSub[i] == str: cnt = cnt+1 return cnt def CountTotal(stri, lstStr): ln = len(lstStr) cntTotal = 0 for i in range(0, ln): cntTotal = cntTotal + CntSingle(stri, str(lstStr[i])) return cntTotal if __name__ == '__main__': lst = [120,121,122,123,124,125] print CountTotal('2', lst)