华为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代码

import java.util.Scanner;
import java.util.List;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;

/**
 * 支持优先级的队列
 * 
 * @since 2023.10.26
 * @version 0.1
 * @author Frank
 *
 */
public class PriorityQueue {
    public static void main(String[] args) {
	Scanner sc = new Scanner(System.in);
	while (sc.hasNext()) {
	    String input = sc.nextLine();
	    int[][] elements = getElements( input );
	    sort( elements );
	    output( elements );
	}
    }

    private static int[][] getElements( String input )
    {
	List<int[]> eleList = new ArrayList();
	
	int indexLeft = 0;
	int indexRight = 0;
	
	while( indexLeft != -1)
	{
	    indexLeft = input.indexOf( "(",  indexRight );
	    indexRight = input.indexOf( ")",  indexRight );
	    if( indexLeft == -1 )
	    {
		break;
	    }
	    String eleStr = input.substring( indexLeft + 1, indexRight );
	    String[] eleArr = eleStr.split( "," );
	    int[] element = new int[2];
	    element[0] = Integer.parseInt( eleArr[0] );
	    element[1] = Integer.parseInt( eleArr[1] );
	    eleList.add( element );
	    
	    indexRight += 1;
	}
	
	int[][] ret = new int[eleList.size()][2];
	for( int i = 0; i < eleList.size(); i ++ )
	{
	    ret[i] = eleList.get( i );
	}
	
	return ret;
    }
    
    private static void sort( int[][] elements) {
	Arrays.sort( elements, new Comparator<int[]>() {
	    @Override
	    public int compare(int[] o1, int[] o2) {
		return o2[1] - o1[1];
	    }
	    
	} );
    }

    private static void output( int[][] elements ) {
	StringBuffer sb = new StringBuffer();
	for( int i = 0; i < elements.length; i ++ )
	{
	    if( i > 0 && ( elements[i][0] ==  elements[i - 1][0] ) && ( elements[i][1] ==  elements[i - 1][1] )  ) {
		continue;
	    }
	    sb.append( elements[i][0] + "," );
	}
	String ret = sb.toString();
	ret = ret.substring( 0, ret.length() - 1);
	System.out.println( ret );
    }
}

JavaScript代码

const rl = require("readline").createInterface({ input: process.stdin });
var iter = rl[Symbol.asyncIterator]();
const readline = async () => (await iter.next()).value;
void async function() {
    while (line = await readline()) {
        var elements = getElements(line);
        sort(elements);
        output(elements);
    }
}();

function getElements(input) {
    var eleList = new Array();

    var indexLeft = 0;
    var indexRight = 0;

    while (indexLeft != -1) {
        indexLeft = input.indexOf("(", indexRight);
        indexRight = input.indexOf(")", indexRight);
        if (indexLeft == -1) {
            break;
        }
        var eleStr = input.substring(indexLeft + 1, indexRight);
        var eleArr = eleStr.split(",");
        var element = new Array();
        element[0] = parseInt(eleArr[0]);
        element[1] = parseInt(eleArr[1]);
        eleList.push(element);

        indexRight += 1;
    }

    return eleList;
}

function sort( elements ) {
    elements.sort( function( a, b) {
        return b[1] - a[1];
    })
}

function output( elements ) {
    var ret = "";
    for( var i = 0; i < elements.length; i ++ )
    {
        if( i > 0 && ( elements[i][0] ==  elements[i - 1][0] ) && ( elements[i][1] ==  elements[i - 1][1] )  ) {
        continue;
        }
        ret += ( elements[i][0] + "," );
    }
    ret = ret.substring( 0, ret.length - 1);
    console.log( ret );
}

(完)

猜你喜欢

转载自blog.csdn.net/ZiJinShi/article/details/134053234