今天开始讲和大家坚持打卡面试非常重要算法练习---剑指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找到理想的工作。如果你想加入,加我拉你进面试交流群。