• 排序相关应用


    1.把数组排序成最小的数

    1)方法一:将当前遍历的字符x与下一个字符y拼接相加起来的值x+y与y+x的大小进行一轮次比较,>0则不断交换当前位与下一位,进行n轮次比较【O(n^2)】

    1. /**
    2. * 输入一个非负整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。
    3. * 输入: [3,30,34,5,9]
    4. * 输出: "3033459"
    5. **/
    6. public class 把数组排成最小的数 {
    7. /**
    8. * 比较当前遍历的字符x与下一个字符y拼接相加起来的值x+y与y+x的大小,x+y字符串对应小于y+x的话就不用交换位置,否则交换位置
    9. * 这里的字符串比较用到compareTo
    10. * @param nums
    11. * @return
    12. */
    13. public String minNumber(int[] nums) {
    14. //先将nums数组转为字符串数组
    15. String[] str=new String[nums.length];
    16. for (int i = 0; i < str.length; i++) {
    17. str[i]=String.valueOf(nums[i]);
    18. }
    19. for (int i = 0; i < str.length; i++) {
    20. for (int j = 0; j < str.length - 1; j++) {
    21. if((str[j]+str[j+1]).compareTo(str[j+1]+str[j])>0){//x+y>y+x// 比如 34,3 --> 343 > 334 所以两个数需要交换位置
    22. String s=str[j];
    23. str[j]=str[j+1];
    24. str[j+1]=s;
    25. }
    26. }
    27. }
    28. //交换完毕字符串数组中就是需要的数组顺序结果,将他转为字符串
    29. StringBuilder sb=new StringBuilder();
    30. for (int i = 0; i < str.length; i++) {
    31. sb.append(str[i]);
    32. }
    33. return sb.toString();
    34. }
    35. }

    2)方法2:应用快排思想思考:

    数据结构之七大排序3—快速排序详解_林纾໌້ᮨ的博客-CSDN博客_数据结构快速排序

    class Solution {
        public String minNumber(int[] nums) {
            String[] strs = new String[nums.length];
            for(int i = 0; i < nums.length; i++)
                strs[i] = String.valueOf(nums[i]);
            quickSort(strs, 0, strs.length - 1);
            StringBuilder res = new StringBuilder();
            for(String s : strs)
                res.append(s);
            return res.toString();
        }
        void quickSort(String[] strs, int l, int r) {
            if(l >= r) return;
            int i = l, j = r;
            String tmp = strs[i];
            while(i < j) {
                while((strs[j] + strs[l]).compareTo(strs[l] + strs[j]) >= 0 && i < j) j--;
                while((strs[i] + strs[l]).compareTo(strs[l] + strs[i]) <= 0 && i < j) i++;
                tmp = strs[i];
                strs[i] = strs[j];
                strs[j] = tmp;
            }
            strs[i] = strs[l];
            strs[l] = tmp;
            quickSort(strs, l, i - 1);
            quickSort(strs, i + 1, r);
        }
    }

    2.扑克牌中的顺子

    1. /**
    2. * 从若干副扑克牌中随机抽 5 张牌,判断是不是一个顺子,即这5张牌是不是连续的。
    3. * 2~10为数字本身,A为1,J为11,Q为12,K为13,而大、小王为 0 ,可以看成任意数字。A 不能视为 14。
    4. * 输入: [1,2,3,4,5]
    5. * 输出: True
    6. * 输入: [0,0,1,2,5]
    7. * 输出: True
    8. **/
    9. //除大小王外无重复的牌(数字),且最大值-最小值<5时可连成顺子。注意最小值不包括大小王对应的0值
    10. public class Num61_扑克牌中的顺子 {
    11. /**
    12. * 方法一:集合Set+遍历
    13. * 遍历五张牌,遇到大小王(即0)直接跳过。
    14. * 判别重复:利用Set实现遍历判重,Set的查找方法的时间复杂度为 O(1);
    15. * 获取最大/最小的牌:借助辅助变量ma和mi,遍历统计即可。
    16. * 当最大牌-最小牌=max-min<5就可以构成顺子
    17. * @param nums
    18. * @return
    19. */
    20. public boolean isStraight(int[] nums) {
    21. Set set=new HashSet<>();
    22. int max=0;
    23. int min=14;
    24. for(int num:nums){
    25. if(num==0){
    26. //遇到大小王(0:可以代替任何牌)直接跳过
    27. continue;
    28. }
    29. max=Math.max(max,num);
    30. min=Math.min(min,num);
    31. //若有重复牌,直接返回false
    32. if(set.contains(num)){
    33. return false;
    34. }
    35. set.add(num);//此时没有重复牌,将其放入set集合中
    36. }
    37. // if(max-min<5){
    38. // return true;
    39. // }else {
    40. // return false;
    41. // }
    42. return max-min<5;
    43. }
    44. /**
    45. * 方法二:排序+遍历
    46. * 先对数组执行排序。
    47. * 判别重复:排序数组中的相同元素位置相邻,因此可通过遍历数组,判断nums[i]=nums[i+1]是否成立来判重。
    48. * 获取最大/最小的牌:排序后,数组末位元素nums[4]为最大牌;元素nums[joker]为最小牌,其中joker为大小王的数量。
    49. */
    50. public boolean isStraight2(int[] nums) {
    51. int joker=0;//统计大小王的数量
    52. Arrays.sort(nums);//数组排序
    53. //排序后重复元素一定相邻,如没有重复元素,max-min<5即顺子【大小王(0)可以代表任何数字,遇到0跳过】
    54. //max一定是num[4],min一定是num[joker](因为0不算在min中)
    55. for (int i = 0; i < 4; i++) {
    56. if(nums[i]==0){
    57. joker++;//统计大小王数量
    58. }else if(nums[i]==nums[i+1]){
    59. return false;//遇到重复,提前返回false
    60. }
    61. }
    62. return nums[4]-nums[joker]<5;
    63. }
    64. }

     

  • 相关阅读:
    Kubernetes-in-action (二)
    javaee thymeleaf简介
    eclipse调试基于freertos的嵌入式工程
    面试中常见的的 web 安全问题
    csdn月入过万的作者是如何练成的?
    MongoDB安装及集成
    【ACWing】3488. 最短路径
    ROS -话题通信示例
    利用热点事件来创作软文的3大技巧?自媒体人必看
    淘宝/天猫、1688、京东API接口—item_search - 按关键字搜索淘宝商品
  • 原文地址:https://blog.csdn.net/m0_58006481/article/details/126005304