计算范围(0,n)中数字'x'的出现次数

时间:2015-06-29 15:41:01

标签: python algorithm memory-management

所以我正在尝试编写一个python函数,它接受两个参数n和num,并计算0和num之间'n'的出现次数。例如,

countOccurrences(15,5)应为2

countOccurrences(100,5)应为20

我对这个问题做了一个简单的迭代解决方案:

def countOccurrences(num,n):
  count=0
  for x in range(0,num+1):
    count += countHelper(str(x),n)
  return count

def countHelper(number,n):
  count=0
  for digit in number:
    if digit==n:
      count += 1
  return count

如果我尝试拨打countOccurrences(100000000000,5),这会遇到明显的问题。 我的问题是如何才能提高效率?我希望能够“公平”快速地处理问题,并避免内存不足错误。这是我尝试执行此操作的递归解决方案的第一次传递:

def countOccurence(num, n):
  if num[0]==n:
    return 1
  else:
    if len(num) > 1:
      return countOccurence(num[1:],n) + countOccurence(str((int(num)-1)),n)
    else:
      return 0

2 个答案:

答案 0 :(得分:2)

这不会遇到任何内存问题,直到max_num足够小以适应C long。基本上它仍然是一种强力算法,尽管已经针对Python进行了大量优化。

def count_digit(max_num, digit):
    str_digit = str(digit)
    return sum(str(num).count(str_digit) for num in xrange(max_num+1))

答案 1 :(得分:0)

我已经修复了我的解决方案,希望它符合您的规格。让我们来看看第一个辅助函数:

def splitNumber(num):
    temp = str(number)
    nums = list(temp)
    return nums

此函数创建数字输入中所有单个数字的字符串列表。例如,

splitNumber(100)

将返回:

['1', '0', '0']

从这里,您可以调用main函数并使用此主函数测试每个单独的数字:

def countOccurences(num, n):
    count = 0
    for x in range(0, (num + 1)):
        temp = splitNumber(x)
        for x in range(len(temp)):
            if (temp[x] == str(n)):
                count = count + 1
    return count

哪个应该提供所需的输出。如果这对您有用,请告诉我!