简体   繁体   中英

Finding unique 9 digit numbers

I'm writing a program that accepts as input a 9 digit number with each number from 1-9 (ie 459876231) The program takes that number and then finds the next highest number with the same digits. The code I have works, but only when I put the print statement within the for loop.

n = int(input("Please input a 9 digit number"))

n_str = str(n)  
n_str1 = str(n+1)

while n < 1000000000:

    for char in n_str:
        if not char in n_str1:
            n += 1
            n_str1 = str(n)
            print(n)

If I put don't indent the print statement to where it is now, the program will not work. Putting the print statement here also displays every number that the program tries on the way to the correct number, and I only want to display the final answer. Why is this happening? I've tried storing n in a completely new variable and then trying to print outside the loop but get the same thing.

It's because if you do n += 1 , n will be 1, then 2, 3.., so you need to print n every time. If you print n outside of the for , it will only print its last value.

Your code is fixed like:

n = int(input("Please input a 9 digit number: "))
n_str = str(n)  
n_str1 = str(n+1)

while n < 1000000000:
    found = True
    for char in n_str:
        if not char in n_str1:
            n += 1
            n_str1 = str(n)
            found = False
            break

    if found:
        print(n)
        break

There is a bug in your condition

    for char in n_str:
        if not char in n_str1:

If input number is 333222323 , n_str1 is 333222324 , digit check char in n_str1 would be all true and 333222323 would be the result.

I find the LeetCode problem 31. Next Permutation is quite similar to your question, and there are already many recommended solutions, most are more efficient than yours.

This example code is based on my LeetCode answer:

nstr = input("Please input a 9 digit number: ")
nums = [int(c) for c in nstr]

l = len(nums) # length should be 9

for i in range(l-2, -1, -1):
    swap_idx, swap_n = None, None
    for j in range(i+1, l):
        if (nums[i] < nums[j]) and (not swap_n or (nums[j] < swap_n)):
            swap_idx, swap_n = j, nums[j]

    if swap_idx:
        tmp = nums[i]
        nums[i] = nums[swap_idx]
        nums[swap_idx] = tmp
        break

nums = nums[:i+1] + sorted(nums[i+1:])
print(''.join([str(i) for i in nums]))

With a test:

Please input a 9 digit number: 459876231
459876312

Please input a 9 digit number: 333222323
333222332

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM