【华为OD题库-088】数字最低位排序-Java

news/2024/7/20 18:16:11 标签: 华为od, java, 排序算法

题目

给定一个非空数组(列表),元素数据类型为整型
请按照数组元素十进制最低位从小到大进行排序
十进制最低位相同的元素,相对位置保持不变
当数组元素为负值时,十进制最低位等同于去除符号位后对应十进制值最低位
输入描述
给定一个非空数组(列表)
其元素数据类型为32位有符号整数
数组长度为[1,1000]
输出描述
排序后的数组
示例1:
输入
1,2,5,-21,22,11,55,-101,42,8,7,32
输出
1,-21,11,-101,2,22,42,32,5,55,7,8

思路

简单排序题,因为要求相对位置不变,所以需要稳定的排序算法
常见的稳定排序有:冒泡排序,插入排序,归并排序
不稳定的排序有:选择排序,快速排序
本文作为对排序的回顾,写了上述所有的排序算法代码

题解

java">package hwod;

import java.util.Arrays;
import java.util.Scanner;


public class NumSortLowest {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int[] nums = Arrays.stream(sc.nextLine().split(",")).mapToInt(Integer::parseInt).toArray();
        int[] res = mergeSort(nums);
        for (int i = 0; i < res.length; i++) {
            if (i != 0) System.out.print(",");
            System.out.print(res[i]);
        }
    }


    // 冒泡排序,稳定,可取
    private static int[] bubblingSort(int[] nums) {
        for (int i = 0; i < nums.length - 1; i++) {
            int flag = 0;
            for (int j = 0; j < nums.length - 1 - i; j++) {
                if (Math.abs(nums[j]) % 10 > Math.abs(nums[j + 1]) % 10) {
                    swap(nums, j, j + 1);
                    flag = 1;
                }
            }
            if (flag == 0) break;
        }

        return nums;
    }

    // 插入排序,稳定可取
    private static int[] insertSort(int[] nums) {
        for (int i = 1; i < nums.length; i++) {
            int key = nums[i];
            int j = i - 1;
            while (j >= 0 && Math.abs(nums[j]) % 10 > Math.abs(key) % 10) {
                nums[j + 1] = nums[j];
                j--;
            }
            nums[j + 1] = key;
        }

        return nums;
    }

    //归并排序,稳定可取
    private static int[] mergeSort(int[] nums) {

        recur2(nums, 0, nums.length - 1);
        return nums;
    }

    private static void recur2(int[] nums, int start, int end) {
        if (start >= end) return;
        int mid = start + end >> 1;
        recur2(nums, start, mid);
        recur2(nums, mid + 1, end);
        int i = start, j = mid + 1, k = 0;
        int[] tmp = new int[end - start + 1];
        while (i <= mid || j <= end) {
            if (j > end || (i <= mid && Math.abs(nums[i]) % 10 <= Math.abs(nums[j]) % 10)) {
                tmp[k++] = nums[i++];
            } else {
                tmp[k++] = nums[j++];
            }
        }
        for (int m = 0; m < tmp.length; m++) {
            nums[start + m] = tmp[m];
        }
    }
    //选择排序,不稳定,本题不可取
    private static int[] selectSort(int[] nums) {
        for (int i = 0; i < nums.length - 1; i++) {
            int minIdx = i;
            for (int j = i + 1; j < nums.length; j++) {
                if (Math.abs(nums[minIdx]) % 10 > Math.abs(nums[j]) % 10) {
                    minIdx = j;
                }
            }
            if (minIdx != i) {
                swap(nums, i, minIdx);
            }
        }

        return nums;
    }

    // 快速排序,不稳定,本题不可取
    private static int[] quickSort(int[] nums) {

        recur(nums, 0, nums.length - 1);

        return nums;
    }

    private static void recur(int[] nums, int start, int end) {
        if (start >= end) return;
        int i = start, j = end, pivot = nums[i];
        while (i < j) {
            while (Math.abs(nums[j]) % 10 > Math.abs(pivot) % 10 && i < j) j--;
            while (Math.abs(nums[i]) % 10 <= Math.abs(pivot) % 10 && i < j) i++;
            if (i < j) {
                swap(nums, i, j);
            }
        }
        swap(nums, i, start);
        recur(nums, start, i - 1);
        recur(nums, i + 1, end);
    }


    private static void swap(int[] nums, int i, int j) {
        int t = nums[i];
        nums[i] = nums[j];
        nums[j] = t;
    }

}


推荐

如果你对本系列的其他题目感兴趣,可以参考华为OD机试真题及题解(JAVA),查看当前专栏更新的所有题目。


http://www.niftyadmin.cn/n/5258469.html

相关文章

深度学习在人体动作识别领域的应用:开源工具、数据集资源及趋动云GPU算力不可或缺

人体动作识别检测是一种通过使用计算机视觉和深度学习技术&#xff0c;对人体姿态和动作进行实时监测和分析的技术。该技术旨在从图像或视频中提取有关人体姿态、动作和行为的信息&#xff0c;以便更深入地识别和理解人的活动。 人体动作识别检测的基本步骤包括&#xff1a; 数…

【StarRocks-1.简介】

一、简介: starRocks起源于开源软件Doris,其相对Doris的社区环境&#xff0c;starRcoks有商业团队维护、快速版本迭代和dockerHub高支持,让我在生产环境中更加偏向于starRocks&#xff0c;而不是拥抱Doris开源社区。StarRocks的版本更新速度、学习文档和论坛都让小白更加容易入…

JeecgBoot jmreport/queryFieldBySql RCE漏洞复现

0x01 产品简介 Jeecg Boot(或者称为 Jeecg-Boot)是一款基于代码生成器的开源企业级快速开发平台,专注于开发后台管理系统、企业信息管理系统(MIS)等应用。它提供了一系列工具和模板,帮助开发者快速构建和部署现代化的 Web 应用程序。 0x02 漏洞概述 Jeecg Boot jmrepo…

小程序跳转tabbar,tabbar页面不刷新

文章地址&#xff1a;12.小程序 之切换到tabBar页面不刷新问题_360问答 解决办法备份&#xff1a; wx.switchTab&#xff1a;跳转到 tabBar 页面&#xff0c;并关闭其他所有非 tabBar 页面 wx.reLaunch&#xff1a;关闭所有页面&#xff0c;打开到应用内的某个页面。 wx.reLa…

Axure的使用

1.Axure是什么&#xff1f;&#xff1f;&#xff1f; Axure是一款功能强大的原型设计工具&#xff0c;它可以让用户快速地创建交互式原型&#xff0c;并针对原型进行测试和改进。Axure的主要特点包括可定制的界面元素库、交互动画效果、条件逻辑、团队协作等功能&#xff0c;适…

2024年法定节假日JSON格式文件

type&#xff1a;类型。0代表上班 1周末休息 2节假日 remark&#xff1a;备注。节假日名称&#xff0c;补为节假日补班 [{"date": "2024-01-01","type": 2,"remark": "元旦"},{"date": "2024-01-02",&q…

Mysql的多表联合查询

内连接 隐式内连接 select column from tb1,tb2 where 条件; 显示内连接 关键字&#xff1a;[inner] join on 显示内连接与外连接的不同是新增的关键字&#xff0c;inner join 以及 使用on 替换了where select column from tb1 [inner] join tb2 on 条件; 外连接 左外…

【matlab进阶学习-7】matlab 图表标注操作

本文参考&#xff1a;MATLAB04:基础绘图-CSDN博客 1&#xff0c;图线的绘制与装饰 plot(x,y,LineSpec) 各参数意义如下: x : 图线上点的x坐标y : 图线上点的y坐标LineSpec : 图线的线条设定,三个指定 线型 , 标记符号 和 颜色 的 设定符 组成一个字符串,设定符不区分先后.具…