一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第4天,点击查看活动详情。
每日刷题 2021.04.04
- leetcode原题链接:leetcode-cn.com/problems/so…
- 难度:中等
- 方法:冒泡排序
题目
- 输入一个非负整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。
示例
- 示例1
输入: [10,2]
输出: "102"
- 示例2
输入: [3,30,34,5,9]
输出: "3033459"
解题思路
- 根据题意可知:需要使用排序算法,但是排序的条件需要自定义
- 关键点:自定义排序的顺序
- 分析:
[3,30,34,5,9] - 取
0和1下标的元素,组合进行比较 =>330 与 303,如果下标为1在前拼接的数小的话,就需要将下标为0和1的元素的值交换。 - 因为冒泡排序会进行
n - 1次遍历,每次将最大的放到数组的尾部。
- 分析:
- 经过
n - 1轮遍历后,数组中的元素均会按照自定义的顺序排列整齐。
拓展
- 所谓稳定性:就是两个相等的元素在数组中相对的位置,排序后是否改变
- 不改变:稳定的排序
- 改变:不稳定的排序
冒泡排序(谁大谁站右边)
- 数组中的数两两进行比较,每次将最大的数移至数组的最后。
- 还需要一个变量记录本轮是否发生过交换。
- 如果本轮没有发生过交换,那么数组中的数据已经全部排好顺序,直接跳出循环
break - 反之,还没有完全排完
- 如果本轮没有发生过交换,那么数组中的数据已经全部排好顺序,直接跳出循环
- 时间复杂度:o(n^2)
- 空间复杂度:o(1)
swap交换技巧
- 要求:不使用第三个中间变量的情况下,完成两个数字的交换
- 先加后减的方式
- 位运算:
arr[i] = arr[i] ^ arr[j];
arr[j] = arr[j] ^ arr[i];
arr[i] = arr[i] ^ arr[j];
快速排序(经典题目)
AC代码
var minNumber = function(nums) {
// 排序好了之后再拼接在一起
function bubbleSort(arr) {
let alen = arr.length, isChange = false;
for(let i = 0; i < alen; i++) {
if(isChange) break;
isChange = true;
for(let j = 0; j < alen - 1; j++) {
// console.log(arr[j + 1] + ''+ arr[j],arr[j] + '' + arr[j + 1])
if((arr[j + 1] + '' + arr[j]) <= (arr[j] + '' + arr[j + 1])){
arr[j + 1] = arr[j + 1] + arr[j];
arr[j] = arr[j + 1] - arr[j];
arr[j + 1] = arr[j + 1] - arr[j];
isChange = false;
}
}
}
}
bubbleSort(nums);
// console.log(nums)
let len = nums.length, ans = '';
for(let i = 0; i < len; i++) {
ans += nums[i];
}
return ans;
};
总结
- 用什么排序算法不重要,重要的考点是:排序算法的条件的转换。