class Solution {
public String minNumber(int[] nums) {
int n = nums.length;
String[] s = new String[n];
for (int i = 0; i < n; i++)
s[i] = Integer.toString(nums[i]);
sort(s, 0, n - 1);
StringBuilder sb = new StringBuilder();
for (String str : s) sb.append(str);
return sb.toString();
}
private void sort(String[] s, int l, int r) {
if (l >= r) return;
String x = s[l + r >> 1];
int i = l - 1, j = r + 1;
while (i < j) {
do { i++; } while ((s[i] + x).compareTo(x + s[i]) < 0);
do { j--; } while ((s[j] + x).compareTo(x + s[j]) > 0);
if (i < j) {
String t = s[i];
s[i] = s[j];
s[j] = t;
}
}
sort(s, l, j);
sort(s, j + 1, r);
}
}
class Solution:
def minNumber(self, nums: List[int]) -> str:
left = 0
right = len(nums) - 1
if len(nums) == 1:
return str(nums[0])
# 快排
self.quickSort(nums,left,right)
nums_str = [str(_) for _ in nums]
return "".join(nums_str)
def quickSort(self,arr,left,right):
if left > right:
return
m = self.partition(arr,left,right)
self.quickSort(arr,left,m-1)
self.quickSort(arr,m+1,right)
def partition(self,arr,left,right):
# 中间值
middle = arr[left]
# 初始化左右边界
i = left
j = right
while i < j:
while i <= j and int(str(middle)+str(arr[i])) >= int(str(arr[i])+str(middle)):
i += 1
while i <= j and int(str(middle)+str(arr[j])) <= int(str(arr[j])+str(middle)):
j -= 1
if i >= j:
break
temp = arr[j]
arr[j] = arr[i]
arr[i] = temp
# 此时i = j,已经分成了两部分
# 将middle基准值放到i的位置上
arr[left] = arr[j]
arr[j] = middle
return j
class Solution:
def minNumber(self, nums: List[int]) -> str:
def sort(x, y):
a = x + y
b = y + x
if a > b:
return 1
elif a < b:
return -1
else:
return 0
nums_str = [str(num) for num in nums]
nums_str.sort(key=functools.cmp_to_key(sort))
return ''.join(nums_str)
class Solution:
def minNumber(self, nums: List[int]) -> str:
if not nums: return nums
res = [str(m) for m in nums]
num = len(res)
for i in range(num):
for j in range(0,num-1-i):
if res[j]+ res[j+1] > res[j+1]+res[j]:
res [j+1] , res[j] = res[j] , res[j+1]
return ''.join(res)
class Solution:
def minNumber(self, nums: List[int]) -> str:
def f_sort(x,y):
a , b = x+y,y+x
if a > b: return 1
elif a< b: return -1
else: return 0
nums = [str(m) for m in nums]
nums.sort(key= functools.cmp_to_key(f_sort))
return ''.join(nums)
时间复杂度O(nlogn),空间复杂度O(n) 用内置函数好想
class Solution {
public:
string minNumber(vector& nums) {
string ans;
int cnt = 0;
for(int i = 0; i < nums.size(); ++i) {
if(nums[i] 0) {
cnt++;
continue;
}
for(int j = i+1; j < nums.size(); ++j) {
if(org(nums[i], nums[j])) swap(nums[i], nums[j]);
}
}
for(int i = 0; i < cnt; ++i) {
ans += to_string(0);
}
for(int i = 0; i < nums.size(); ++i) {
printf(“%d\t”, nums[i]);
if(nums[i] 0) continue;
ans += to_string(nums[i]);
}
return ans;
}
bool org(int m, int n) {
string str1 = intToString(m, n);
string str2 = intToString(n, m);
return stringToInt(str1) > stringToInt(str2);
}
string intToString(int m, int n) {
string strm;
string strn;
int t;
int k = 10;
while(m > 0) {
t = m%k;
m /= 10;
strm += t;
}
reverse(strm.begin(), strm.end());
while(n > 0) {
t = n%k;
n /= 10;
strn += t;
}
reverse(strn.begin(), strn.end());
return strm+strn;
}
long long stringToInt(string str) {
long long ans = 0;
for(int i = 0; i < str.size()-1; ++i) {
ans += str[i];
ans *= 10;
}
ans += str[str.size()-1];
return ans;
}
/**
本质上是一个排序问题,假设字符串分别为x,y
若x + y < y + x 则 xy组合出的数字更小,x应该排在前面
若x + y > y + x 则 yx组合出的数字更小,y应该排前面
对数组中任意两个元素进行比较排列,就可以对整个数组得到最小排序
*/
class Solution {
public String minNumber(int[] nums) {
String[] s = new String[nums.length];
for(int i = 0;i < nums.length;i++){
s[i] = String.valueOf(nums[i]);
}
Arrays.sort(s,(o1,o2)->(o1+o2).compareTo(o2+o1));
return String.join("",s);
}
}
class Solution:
def minNumber(self, nums: List[int]) -> str:
nums = [str(n) for n in nums]
n = len(nums)
for i in range(n):
for j in range(0, n - 1 - i):
if nums[j] + nums[j + 1] > nums[j + 1] + nums[j]:
nums[j], nums[j+ 1] = nums[j+1], nums[j]
return ''.join(nums)
共以下 22 个回答
快速排序,注意检查下标
快排思想
时间:O(NlogN)
空间:O(N)
时间O(nlogn)
空间O(n)
时间复制度O(nlogn)
思路:快排
时间复杂度O(N logN)
空间复杂度 O(n)
a+b>b+a
没看懂
C++:
我这个就是暴力吧,我看数据长度才100。但是我有跟着视频练一下快排
class Solution {& nums) {
public:
string minNumber(vector
string ans;
int cnt = 0;
for(int i = 0; i < nums.size(); ++i) {
if(nums[i] 0) {
cnt++;
continue;
}
for(int j = i+1; j < nums.size(); ++j) {
if(org(nums[i], nums[j])) swap(nums[i], nums[j]);
}
}
for(int i = 0; i < cnt; ++i) {
ans += to_string(0);
}
for(int i = 0; i < nums.size(); ++i) {
printf(“%d\t”, nums[i]);
if(nums[i] 0) continue;
ans += to_string(nums[i]);
}
return ans;
}
};
时间:O(nlog(n)),空间:O(n)
时间复杂度O(nlogn)空间复杂度O(n)
手动实现快排
快排实现
时间复杂度为O(nlgn),空间复杂度为O(n)
冒泡排序
时间复杂度 log(n)