class Solution {
// compare a and b, return true if a > b
bool compare(int a, int b) {
std::string as = std::to_string(a);
std::string bs = std::to_string(b);
auto ab = [&](int i) -> char {
if (i >= as.length()) return bs[i - as.length()];
else return as[i];
};
auto ba = [&](int i) -> char {
if (i >= bs.length()) return as[i - bs.length()];
else return bs[i];
};
for (int i = 0; i < as.length() + bs.length(); i++)
if (ab(i) > ba(i)) return true;
else if (ab(i) < ba(i)) return false;
return true;
}
void quickSort(vector<int>& nums, int left, int right) {
if (left >= right) return;
int l = left, r = right, mid = nums[left];
// find the position for mid
while(l < r) {
while (compare(nums[r], mid) && l < r) r--;
while (compare(mid, nums[l]) && l < r) l++;
if (l < r) std::swap(nums[l], nums[r]);
}
// divide the left into left and right 2 parts
if (compare(nums[left], nums[l])) std::swap(nums[left], nums[l]);
quickSort(nums, left, l - 1);
quickSort(nums, l + 1, right);
}
public:
string minNumber(vector<int>& nums) {
quickSort(nums, 0, nums.size() - 1);
string s;
for (auto &n: nums)
s += std::to_string(n);
return s;
}
};
class Solution:
def minNumber(self, nums: List[int]) -> str:
def quickSort(arr, l, r):
if l > r:
return
i = partition(arr, l, r)
quickSort(arr, l, i - 1)
quickSort(arr, i + 1, r)
def partition(arr, l, r):
p = arr[l]
v, w = l, r
while v < w:
while v <= w and arr[v] + p <= p + arr[v]:
v += 1
while v <= w and arr[w] + p >= p + arr[w]:
w -= 1
if v >= w:
break
temp = arr[v]
arr[v] = arr[w]
arr[w] = temp
arr[l] = arr[w]
arr[w] = p
return w
nums = [str(num) for num in nums]
quickSort(nums, 0, len(nums)-1)
return "".join(nums)
共以下 21 个回答
“`java
//需要想明白可以用排序
public String crackPassword(int[] password) {
if (password == null || password.length == 0) {
return “”;
}
String[] strs = new String[password.length];
for (int i = 0; i < password.length; i++) { strs[i] = String.valueOf(password[i]); } Arrays.sort(strs, (x,y) -> (x + y).compareTo(y+x));
StringBuilder sb = new StringBuilder();
for (int i = 0; i < password.length; i++) { sb.append(strs[i]); } return sb.toString(); }
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]);
}
quicksort(s,0,s.length-1);
String res = “”;
for(int i=0;i<s.length;i++){
res=res+s[i];
}
return res;
}
void quicksort(String[] nums,int left,int right){
}
快速排序的思想
class Solution {
public String minNumber(int[] nums) {
// 想法1.直接使用 快排或者冒泡,然后再逐一拼凑即可。
// 先进行一个数组的转换
// 时间复杂度为 O(n^2) ,空间 为 O(1)
String [] s= new String[nums.length];
}
快排,时间复杂度O(nlogn) 空间复杂度O(1)
“`C++& nums) {
bool compare(int a, int b) {
string str1 = to_string(a) + to_string(b);
string str2 = to_string(b) + to_string(a);
return str1 < str2; } string minNumber(vector
string result;
}
“`
【思路】快排思想将数字排序,最后转化为字符串拼接起来
【复杂度】时间复杂度为O(nlogn),空间复杂度O(1)
时间复杂度O(numsSize)
空间复杂度为O(1)
通过pivot放前或者放后比较
自定义排序
时间:O(nlogn)
空间:O(n)
时间复杂度O(nlogn)
我的选择是调用接口
快排。
思路:按照字符串拼接排序
时间复杂度O(n) 空间复杂度O(1)
时间复杂度:O(nlogn)
空间复杂度:O(n)
c++实现& nums) {
string minNumber(vector
sort(nums.begin(),nums.end(),[](int n1,int n2){
string s1= to_string(n1);
string s2 = to_string(n2);
return (s1+s2)<(s2+s1);
});
string ret;
for(auto num:nums)
{
ret+=to_string(num);
}
return ret;
}
时间复杂度:O(nlogn)
空间复杂度:O(n)
MY排序规则
x+y < y+x, x<y