输入数字n,按顺序打印出从1到最大的n位十进制数。
设置一个与n位数字相等的序列number
,默认值都为字符0
。对于递增函数increment
,overflow_flag
来结束所有的循环,carry
来负责进位的情况。形参的传递采用的是可变对象,也就是直接操作对象影响值。
class Solution:
def print_one_to_max_of_digits(self, n):
if n <= 0:
return False
number = ['0'] * n
while not self.increment(number):
self.print_number(number)
def increment(self, number):
overflow_flag, carry = False, 0
n = len(number)
for ni in range(n-1, -1, -1):
n_value = ord(number[ni]) - ord('0') + carry
if ni == n-1: # 从0...01开始
n_value += 1
if n_value >= 10:
if ni == 0: # 结束条件
overflow_flag = True
else:
n_value -= 10
carry = 1
number[ni] = chr(ord('0') + n_value)
else:
number[ni] = chr(ord('0') + n_value)
# print(number)
break
return overflow_flag
def print_number(self, number):
ni = 0
for ni, nu in enumerate(number):
if nu != '0':
break
print(''.join(number[ni:]))
st = Solution()
n = 4
st.print_one_to_max_of_digits(n)
把问题转换成数字排列的解法,索引index
从0开始向外扩展开来,当与长度length
相等的时候则打印值。由于是按序输出,所以方向应该是从左到右的排序。
class Solution:
def print_one_to_max_of_digits(self, n):
if n <= 0:
return False
number = ['0'] * n
self.change_carry_digit_recursively(number, n, 0)
def change_carry_digit_recursively(self, number, length, index):
if index == length:
if set(number) != {'0'}: # 从1开始
self.print_number(number)
return
for digit in range(10):
number[index] = chr(digit + ord('0'))
self.change_carry_digit_recursively(number, length, index+1) # 从个位开始,依次往前
def print_number(self, number):
ni = 0
for ni, nu in enumerate(number):
if nu != '0':
break
print(''.join(number[ni:]))
st = Solution()
n = 4
st.print_one_to_max_of_digits(n)
(最近更新:2019年09月21日)