• 华为OD机考算法题:支持优先级的队列


    题目部分

    题目支持优先级的队列
    难度
    题目说明实现一个支持优先级的队列,高优先级(数字越大,优先级越高)先出队列;同优先级时先进先出。
    如果两个输入数据和优先级都相同,则后一个数据不入队列被丢弃。
    队列存储的数据内容是一个整数。
    输入描述一组待存入队列的数据(包含内容和优先级),每组数字内容在前,优先级在后。
    输出描述队列的数据内容(优先级信息输出时不再体现)。
    补充说明不用考虑输入数据不合法的情况,测试数据不超过100个。
    ------------------------------------------------------
    示例
    示例1
    输入(10,1),(20,1),(30,2),(40,3)
    输出40,30,10,20
    说明输入样例中,向队列写入了 4 个数据,每个数据由数据内容和优先级组成。
    输入和输出内容都不含空格。
    数据 40 的优先级最高,所以最先输出,其次是 30;10 和 20 优先级相同,所以按输入顺序输出。
    示例2
    输入(10,1),(10,1),(30,2),(40,3)
    输出40,30,10
    说明输入样例中,向队列写入了4个数据,每个数据由数据内容和优先级组成。
    输入和输出内容都不含空格。
    数据 40 的优先级最高,所以最先输出,其次是 30;两个 10 和 10 构成重复数据,被丢弃一个。


    解读与分析

    题目解读

    输入一个字符串,把字符串解析成各种队列数据,根据优先级输出数据,如果优先级相同,则按照原顺序输出。

    分析与思路

    分两步实现。
    1. 解析:对收入的字符串以 “(” 和 “)” 配对,解析成每组数据元素 element,包括数据内容(element[0])和数据优先级( element[1] )。并把它放到数组 dataArray (dataArray 的元素为 element)中。
    2. 排序:对数组中的数据进行排序,排序的规则为按照每个元素的 element[1] 大小排序(从大到小)。
    3. 输出:对排序的元素,逐个输出数据内容(element[0]),需要注意的是,如果前一个输出的数据的内容和优先级与当前即将输出的数据相等,则忽略,继续下一个。

    此算法的时间复杂度和空间复杂度均为 O(n)。


    代码实现

    Java代码

    1. import java.util.Scanner;
    2. import java.util.List;
    3. import java.util.ArrayList;
    4. import java.util.Arrays;
    5. import java.util.Comparator;
    6. /**
    7. * 支持优先级的队列
    8. *
    9. * @since 2023.10.26
    10. * @version 0.1
    11. * @author Frank
    12. *
    13. */
    14. public class PriorityQueue {
    15. public static void main(String[] args) {
    16. Scanner sc = new Scanner(System.in);
    17. while (sc.hasNext()) {
    18. String input = sc.nextLine();
    19. int[][] elements = getElements( input );
    20. sort( elements );
    21. output( elements );
    22. }
    23. }
    24. private static int[][] getElements( String input )
    25. {
    26. List<int[]> eleList = new ArrayList();
    27. int indexLeft = 0;
    28. int indexRight = 0;
    29. while( indexLeft != -1)
    30. {
    31. indexLeft = input.indexOf( "(", indexRight );
    32. indexRight = input.indexOf( ")", indexRight );
    33. if( indexLeft == -1 )
    34. {
    35. break;
    36. }
    37. String eleStr = input.substring( indexLeft + 1, indexRight );
    38. String[] eleArr = eleStr.split( "," );
    39. int[] element = new int[2];
    40. element[0] = Integer.parseInt( eleArr[0] );
    41. element[1] = Integer.parseInt( eleArr[1] );
    42. eleList.add( element );
    43. indexRight += 1;
    44. }
    45. int[][] ret = new int[eleList.size()][2];
    46. for( int i = 0; i < eleList.size(); i ++ )
    47. {
    48. ret[i] = eleList.get( i );
    49. }
    50. return ret;
    51. }
    52. private static void sort( int[][] elements) {
    53. Arrays.sort( elements, new Comparator<int[]>() {
    54. @Override
    55. public int compare(int[] o1, int[] o2) {
    56. return o2[1] - o1[1];
    57. }
    58. } );
    59. }
    60. private static void output( int[][] elements ) {
    61. StringBuffer sb = new StringBuffer();
    62. for( int i = 0; i < elements.length; i ++ )
    63. {
    64. if( i > 0 && ( elements[i][0] == elements[i - 1][0] ) && ( elements[i][1] == elements[i - 1][1] ) ) {
    65. continue;
    66. }
    67. sb.append( elements[i][0] + "," );
    68. }
    69. String ret = sb.toString();
    70. ret = ret.substring( 0, ret.length() - 1);
    71. System.out.println( ret );
    72. }
    73. }

    JavaScript代码

    1. const rl = require("readline").createInterface({ input: process.stdin });
    2. var iter = rl[Symbol.asyncIterator]();
    3. const readline = async () => (await iter.next()).value;
    4. void async function() {
    5. while (line = await readline()) {
    6. var elements = getElements(line);
    7. sort(elements);
    8. output(elements);
    9. }
    10. }();
    11. function getElements(input) {
    12. var eleList = new Array();
    13. var indexLeft = 0;
    14. var indexRight = 0;
    15. while (indexLeft != -1) {
    16. indexLeft = input.indexOf("(", indexRight);
    17. indexRight = input.indexOf(")", indexRight);
    18. if (indexLeft == -1) {
    19. break;
    20. }
    21. var eleStr = input.substring(indexLeft + 1, indexRight);
    22. var eleArr = eleStr.split(",");
    23. var element = new Array();
    24. element[0] = parseInt(eleArr[0]);
    25. element[1] = parseInt(eleArr[1]);
    26. eleList.push(element);
    27. indexRight += 1;
    28. }
    29. return eleList;
    30. }
    31. function sort( elements ) {
    32. elements.sort( function( a, b) {
    33. return b[1] - a[1];
    34. })
    35. }
    36. function output( elements ) {
    37. var ret = "";
    38. for( var i = 0; i < elements.length; i ++ )
    39. {
    40. if( i > 0 && ( elements[i][0] == elements[i - 1][0] ) && ( elements[i][1] == elements[i - 1][1] ) ) {
    41. continue;
    42. }
    43. ret += ( elements[i][0] + "," );
    44. }
    45. ret = ret.substring( 0, ret.length - 1);
    46. console.log( ret );
    47. }

    (完)

  • 相关阅读:
    条码二维码读取设备在医疗设备自助服务的重要性
    JSP学生成长档案管理系统myeclipse开发sql数据库BS模式java编程网页结构
    线扫相机DALSA--分频倍频计算公式及原理
    【面试普通人VS高手系列】volatile关键字有什么用?它的实现原理是什么?
    un9.20:解决项目启动时端口被占用的问题。
    【TWS API 问题2】如何用盈透证券的TWS API持续获取5分钟K线的问题?
    单片机论文参考:2、基于单片机的病床呼叫系统设计
    MySQL 锁机制
    第七章 设计zrlog项目的测试用例(7.1章节)
    linux下usleep函数对CPU占用率的影响
  • 原文地址:https://blog.csdn.net/ZiJinShi/article/details/134053234