【华为OD】B\C卷真题 100%通过:字符串统计 C/C++实现

news/2024/7/20 17:56:41 标签: 华为od, c语言, c++, 数据结构, 算法, leetcode

目录

题目描述:

示例1

代码实现:


【华为OD】B\C卷真题 100%通过:字符串统计 C/C++实现

题目描述:

给定两个字符集合,一个为全量字符集,一个为已占用字符集。已占用的字符集中的字符不能再使用,要求输出剩余可用字符集。

输入描述

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。

因此输出a:2,b:3,c:2

代码实现:

#include <string>
#include <map>
#include <iostream>
#include <sstream>
#include <algorithm>
#include <vector>


using namespace std;

class SData {
public:
	char k;
	int cnt;
	int size;

	bool operator<(const SData &other) const {
		return size < other.size;
	}

	SData(char key = 0, int cnt = 0, int len = 0) : k(key), cnt(cnt), size(len) {
	}
};

class Solution {

public:

	Solution(const string &s) {
		int idx = s.find('@');
		if (idx == string::npos) {
			dealData(s, false);
		}
		else {
			dealData(s.substr(0, idx), false);
			dealData(s.substr(idx + 1), true);
		}
		vector<SData> tmp(m_data.size());
		m_vsd = tmp;
		for (auto &item : m_data) {
			m_vsd.push_back(item.second);
		}
		calc();
	}
	string out() const {
		return m_res;
	}
private:
	void calc() {
		sort(m_vsd.begin(), m_vsd.end());
		for (auto &e : m_vsd) {
			if (e.cnt > 0) {
				m_res.push_back(e.k);
				m_res.append(":").append(to_string(e.cnt)).append(",");
			}
		}
		m_res.pop_back();
	}

	void dealData(const string &s, bool fg) {
		if (s.empty()) {
			return;
		}
		istringstream ss(s);
		int size = 0, cnt;
		char k;
		while (ss >> k >> cnt) {
			if (fg) {
				m_data[k].cnt -= cnt;
			}
			else {
				m_data[k] = { k, cnt, size++ };
			}
		}
	}


	vector<SData> m_vsd;
	string m_res;
	map<char, SData> m_data;
};


int main() {
	string lineStr;
	getline(cin, lineStr);
	replace_if(lineStr.begin(), lineStr.end(), [](char c) { return c == ':' || c == ','; }, ' ');
	Solution so(lineStr);
	cout << so.out() << endl;
	return 0;
}


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

相关文章

混社会,要知道的“人性铁律”

混社会&#xff0c;要知道的“人性铁律”&#xff1a; 1.女人的私密生活&#xff0c;生理需求往往都是心口不一。 【闲聊】&#xff1a;一个人越是想要什么&#xff0c;往往嘴里越是说不在意&#xff0c;无论是男女。 2.普通人的思维&#xff0c;往往把宏大的社会变迁所造成…

2311skia,05绘制文本

绘画文字 绘画文字主要包括转换编码(主要是中文),解析字形(点线或image)和实际渲染三个步骤.在该过程中,解析字形和实际渲染均是耗时步骤. Skia缓存解析文字的结果.在中文字较多,使用多种字体,绘画风格(粗/斜体)有变化时,该缓存会很大,因此Skia文字,限制了缓存的内存. 1,SkP…

npm中的npx命令

1.概念 npx是一个执行npm软件包的二进制文件&#xff0c;通俗的讲&#xff0c;他可以执行npm的一些指令。 2.示例 用babel将ES6语法转为ES5语法 npx babel src/js -d dist/js会执行babel的相关功能&#xff0c;如果没有安装&#xff0c;也会自动安装。 当在执行npx <co…

linklab phase1 更简单的方法

直接反汇编phase1.o&#xff0c;看eax中是0x21&#xff0c;0x21在数据域中&#xff0c;直接把从第21个字节的内容改为0000000000即可。

c语言实现10进制转16进制

代码如下&#xff1a; #define _CRT_SECURE_NO_WARNINGS #include <stdio.h>int dectohex(int b, char array[]) {char a[17] { "0123456789ABCDEF" };int c[30] { 0 }, i 0, base 16, j 0;while (b){c[i] b % base;b b / base;}j i;for (i--; i >…

WSL开发环境配置指南

WSL开发环境配置指南 WSL 安装 Ubuntu20.04 wsl --list --online 查看能够使用的linux发行版wsl --install Ubuntu-20.04 安装Ubuntu2004发行版wsl --shutdown Ubuntu-20.04 关闭Ubuntu2004发行版wsl --export Ubuntu-20.04 W:\Linux\Ubuntu\Ubuntu-20.04\Ubuntu2004.tar 将Ubu…

HCIA-Datacom跟官方路线学习第三部分(更改策略)

上一部分&#xff1a;HCIA-Datacom跟官方路线学习第二部分-CSDN博客 11.06——11.11&#xff1a;从找出之前的网络工程师资料进行复习。重新温习了一遍网络工程师的资料。 11.11——11.21&#xff1a;准备工作&#xff0c;于是选择一条路线进行学习。花费了10天时间&#xff…

对称加密与非对称加密的区别是什么?

对称加密与非对称加密的区别是什么&#xff1f; 对称加密概念&#xff1a;好处和坏处&#xff1a;基本原理 非对称加密概念&#xff1a;工作原理&#xff1a; 两者区别安全性处理速度密钥管理通信双方数量 对称加密 概念&#xff1a; 同一个密钥可以同时用来对信息进行加密和…