字符串统计

题目部分

题目 字符串统计
难度
题目说明 给定两个字符集合,一个是全量字符集,一个是已占用字符集,已占用字符集中的字符不能再使用,要求输出剩余可用字符集。
输入描述 1. 输入一个字符串 一定包含@,@前为全量字符集 @后的为已占用字符集。
2. 已占用字符集中的字符,一定是全量字符集中的字符,字符集中的字符跟字符之间使用英文逗号隔开。
3. 每个字符都表示为字符加数字的形式,用英文冒号分隔,比如 a:1 标识 1 个 a 字符。
4. 字符只考虑英文字母,区分大小写,数字只考虑正整型 不超过100。
5. 如果一个字符都没被占用,@标识仍存在,例如 a:3,b:5,c:2@。
输出描述 输出可用字符集,不同的输出字符集之间用回车换行。
注意:输出的字符顺序要跟输入的一致,不能输出b:3,a:2,c:2。
如果某个字符已全部占用,则不需要再输出。
补充说明
------------------------------------------------------
示例
示例1
输入 a:3,b:5,c:2@a:1,b:2
输出 a:2,b:3,c:2
说明 全量字符集为 3 个 a,5 个 b,2 个 c。
已占用字符集为 1 个 a,2 个 b。
由于已占用字符不能再使用,因此,剩余可用字符为 2 个 a,3 个 b, 2 个 c。
示例2
输入 a:3,b:5,c:2@
输出 a:3,b:5,c:2
说明 没有占用任何字符,输出所有字符及其对应个数。


解读与分析

题目解读

输入一个字符串,以 @ 隔开,@之前的是全量字符集,@之后是占用字符集。无论是全量字符集,还是占用字符集,每个字符及其个数以“字符:个数”的方式表示,不同的字符和个数之间用 , 隔开。如果 @ 后为空,则表示没有占用字符集。
输出剩下未占用的字符集,如果某个字符已经全部被占用,则不输出此字符。

分析与思路

此题的关键在于解析。
1. 先以 @ 为分隔符解析字符串,@ 之前为全量字符集,@ 之后为占用字符集。
2. 对于 @ 之前的字符集,以 “,” 为分隔符号,分隔出 “字符:个数”的格式,然后以 “:” 为分隔符,分隔出字符和其个数,顺序存放到数组中 charSetList 中。
3. 以步骤 2 中相同的方式解析占用字符集,如果不存在则直接输出全量字符,退出。
4. 遍历占用字符集,找到其在全量字符集中的字母,更新其个数(全量个数 减去 占用个数)。
5. 顺序遍历全量字符集,如果某个字母的个数为 0,则忽略它。


代码实现

Java代码

import java.util.Scanner;
import java.util.List;
import java.util.ArrayList;
import java.util.Map;
import java.util.HashMap;

/**
 * 字符串统计
 * 
 * @since 2023.11.20
 * @version 0.1
 * @author Frank
 *
 */
public class StringStat {

    public static void main(String[] args) {
	Scanner sc = new Scanner(System.in);
	while (sc.hasNext()) {
	    String input = sc.nextLine();
	    processStringStat(input);
	}

    }

    private static void processStringStat(String input) {
	String ret = "";
	String[] charSet = input.split( "@" );
	if( charSet.length == 1 )
	{
	    if( input.endsWith( "@" ))
	    {
		 ret = input.substring( 0, input.length() - 1 );
	    }else
	    {
		ret = input;
	    }	   
	    System.out.println( ret );
	    return;
	}
	
	List[] charSetList = new ArrayList[2];
	Map[] charSetNumMap = new HashMap[2];
	for( int i = 0; i < 2; i ++ )
	{
	    List tmpCharSetList = new ArrayList();
	    Map tmpCharSetNumMap = new HashMap();
	    String[] charNum = charSet[i].split( "," );
	    for( int j = 0; j < charNum.length; j ++ )
	    {
		String tmpCharNum = charNum[j];
		String[] eachItem = tmpCharNum.split( ":" ); 
		Character key = eachItem[0].charAt( 0);
		Integer value = Integer.parseInt( eachItem[1] );
		tmpCharSetList.add( key );
		tmpCharSetNumMap.put( key , value );
	    }
	    charSetNumMap[i] = tmpCharSetNumMap;
	    charSetList[i] = tmpCharSetList;
	}
	
	for( int i = 0; i < charSetList[1].size(); i ++ )
	{
	    Character tmpChar = charSetList[1].get( i );
	    int count = charSetNumMap[0].get( tmpChar ) - charSetNumMap[1].get( tmpChar );
	    charSetNumMap[0].put( tmpChar, count );
	}
	
	StringBuffer sb = new StringBuffer();
	for( int i = 0; i < charSetList[0].size(); i ++ )
	{
	    Character tmpChar = charSetList[0].get( i );
	    int count = charSetNumMap[0].get( tmpChar );
	    if( count == 0 )
	    {
		continue;
	    }
	    sb.append( tmpChar + ":" + count + ",");
	}
	ret = sb.toString();
	if( ret.length() >= 1 )
	{
	    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()) {
        processStringStat(line);
    }
}();

function processStringStat( input ) {
    var ret = "";
    var charSetArray = input.split( "@" );
    if( charSetArray.length == 1 || charSetArray[1].length == 0)
    {
        if( input.endsWith( "@" ))
        {
            ret = input.substring( 0, input.length - 1 );
        }else
        {
            ret = input;
        }      
        console.log( ret );
        return;
    }
    
    var charSetList = new Array();
    var charSetNumMap = new Map();
    for( var i = 0; i < 2; i ++ )
    {
        var tmpCharSetList = new Array();
        var tmpCharSetNumMap = new Map();
        var charNum = charSetArray[i].split( "," );
        for( var j = 0; j < charNum.length; j ++ )
        {
            var tmpCharNum = charNum[j];
            var eachItem = tmpCharNum.split( ":" ); 
            var key = eachItem[0];
            var value = parseInt( eachItem[1] );
            tmpCharSetList.push( key );
            tmpCharSetNumMap.set( key , value );
        }
        charSetNumMap[i] = tmpCharSetNumMap;
        charSetList[i] = tmpCharSetList;
    }
    
    for( var i = 0; i < charSetList[1].length; i ++ )
    {
        var tmpChar = charSetList[1][i];
        var count = charSetNumMap[0].get( tmpChar ) - charSetNumMap[1].get( tmpChar );
        charSetNumMap[0].set( tmpChar, count );
    }
    
    for( var i = 0; i < charSetList[0].length; i ++ )
    {
        var tmpChar = charSetList[0][ i ];
        var count = charSetNumMap[0].get( tmpChar );
        if( count == 0 )
        {
            continue;
        }
        ret += ( tmpChar + ":" + count + "," ) ;
    }
    if( ret.length >= 1 )
    {
        ret = ret.substring( 0, ret.length - 1 );
    }   
    
    console.log( ret );
}

(完)

你可能感兴趣的:(华为OD机考,python,算法,开发语言,华为od,数据结构,Java)