求下一個大數

趣享Eureka發表於2020-10-25
# 下一個大數
def next_bigger(number):
    """
    逆序的原因是: 求下一個數通常都是從末尾開始比較的
    :param number: 
    :return: 
    """
    reverse_number = str(number)[::-1]  # n 為從後往前的列表
    print(reverse_number)
    try:
        # 計算從第1位到第n-1 位數字中, 哪一個前者比後者大,將最小下標付給i
        # 之所以加1, 方便下面切片操作
        i = min(index + 1 for index in range(len(reverse_number[:-1]))
                if reverse_number[index] > reverse_number[index + 1])

        print(i)
        # 找到比reverse_number[i]大的元素的最小下標
        # 上一段程式碼找出相鄰元素中,前者比後者大的元素的下標i
        # 下一段程式碼是定位比i下標元素還小的元素位置
        j = reverse_number[:i].index(
            min([a for a in reverse_number[:i]
                 if a > reverse_number[i]]))
        print(j)
        # i就是存在前一個數比後一個數大的元素的最小下標
        # reverse_number[i + 1::][::-1]  求出i 之後所有的元素,並通過逆序恢復原來的次序,為何此時i要加1
        # i 肯定大於 j
        return int(reverse_number[i + 1::][::-1] + reverse_number[j] + ''.join(
            sorted(reverse_number[j + 1:i + 1] + reverse_number[:j])))
    except:
        return -1

if __name__ == '__main__':
    
    # print(next_bigger(12222))
    print(next_bigger(10))  # 因為找不到前者比後者大而報錯
    # print(next_bigger(12375))
    # print(next_bigger(789178917891))
    

相關文章