今天开始讲和大家坚持打卡面试非常重要算法练习---剑指offer,希望我们能一起肝。

1 题目描述

输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。

2 思路----python

  • 先将数字列表转化成字符串链表,这样便于在一个字符串后面直接加上另外一个字符串。也就是 "3"+"321"="3321","3"+"321"="3321" 。

  • 造一个比较函数,当 str1+str2>str2+str1str1+str2>str2+str1 时我们认为字符串 str1>str2str1>str2 。

  • 将字符串列表按照比较函数的规定进行冒泡排序(或其它方法排序),将定义为”大”的字符串放到最后。而”小”的字符串放在前面。最后将字符串列表链接起来,便是所求。

3 代码实现

c++版本

class Solution {
public:
    string PrintMinNumber(vector<int> numbers) {
        vector<string> temp(numbers.size());
        stringstream s;
        for(int i=0;i<numbers.size();++i){
            s << numbers[i];
            s >> temp[i];
            s.clear();
        }
        sort(temp.begin(),temp.end(),cmp);
        string ret = "";
        for(auto i=temp.begin();i<temp.end();++i)
            ret += *i;
        return ret;
    }

    static bool cmp(string &A, string &B){
        return A + B < B + A;
    }
};

java版本

//如果(字符组合)ab<ba,则a排在前。
import java.util.*;
public class Solution {
    public String PrintMinNumber(int[] numbers) {
        List<String> list = new ArrayList<>();
        for (int number : numbers)
            list.add(Integer.toString(number));
        list.sort((a,b)->(a+b).compareTo(b+a));
        return String.join("", list);
    }
}

python版本

class Solution:
    def theMax(self, str1, str2):
        '''定义字符串比较函数'''
        return str1 if str1+str2 > str2+str1 else str2

    def PrintMinNumber(self, numbers):
        """使用冒泡进行排序(把最大的放最后)"""
        string = [str(num) for num in numbers]
        res = []
        flag = True
        count = len(string) - 1
        while flag and  count > 0:
            flag = False
            for i in range(len(string)-1):
                if self.theMax(string[i], string[i+1]) == string[i]:
                    temp = string[i]
                    del string[i]
                    string.insert(i+1, temp)
                    flag = True
            count -= 1
        string = ''.join(string)
        return string

4 唠嗑

2020年8月11日打卡,打卡格式"打卡XX天"。暖蓝汇聚大家一起,探讨简历修改,面试经历分享,尽全力让大家能在2020找到理想的工作。如果你想加入,加我拉你进面试交流群。