劍指offer 把數組排成最小的數

題目

輸入一個正整數數組,把數組裏所有數字拼接起來排成一個數,打印能拼接出的所有數字中最小的一個。例如輸入數組{3,32,321},則打印出這三個數字能排成的最小數字爲321323。

思路

排序算法,如果num1+num2<num2+num1 ,則num1 排在num2 左邊。

代碼

# -*- coding:utf-8 -*-
class Solution:
    def cmp(self, leftNum, rightNum):
        return int(str(leftNum) + str(rightNum)) > int(str(rightNum) + str(leftNum))
    def partition(self, numbers, left, right):
        leftIndex = left
        tmp = numbers[left]
        while left <= right:
            while left <= right and not self.cmp(numbers[left], tmp): left += 1
            while left <= right and self.cmp(numbers[right], tmp): right -= 1
            if left <= right: numbers[left], numbers[right] = numbers[right], numbers[left]
        numbers[leftIndex], numbers[right] = numbers[right], numbers[leftIndex]
        return right
    def qsort(self, numbers, left, right):
        if left < right:
            part = self.partition(numbers, left, right)
            self.qsort(numbers, left, part - 1)
            self.qsort(numbers, part + 1, right)
    def PrintMinNumber(self, numbers):
        # write code here
        if not numbers: return ""
        self.qsort(numbers, 0, len(numbers) - 1)
        tmp = [str(num) for num in numbers]
        return int(''.join(tmp))
發佈了572 篇原創文章 · 獲贊 47 · 訪問量 30萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章