VJ STL Encoding(解题过程+学到的新知识:结构体作map key,value,构造cmp+嵌套map的一些误区)

golang 结构体作为map的元素时,不能够直接赋值给结构体的某个字段 引入: 错误 Reports assignments directly to a struct field of a map 1. 问题的产生 这个问题在github上可以追溯到2012年提交的一个issue,链接为https://github.com/golang/go/issues/3117;如上图,结构体作为map的元素时,不能够直接赋值给结构体的某个字段,也就是map中的struc... 阅读详情

question:

Given a string containing only ‘A’ - ‘Z’, we could encode it using the following method:

  1. Each sub-string containing k same characters should be encoded to “kX” where “X” is the only character in this sub-string.

  2. If the length of the sub-string is 1, ‘1’ should be ignored.

Input:
The first line contains an integer N (1 <= N <= 100) which indicates the number of test cases. The next N lines contain N strings. Each string consists of only ‘A’ - ‘Z’ and the length is less than 10000.

Output:
For each test case, output the encoded string in a line.

Sample Input:
2
ABC
ABBCCC

Sample Output:
ABC
A2B3C

本来不是什么难题。但是读题没读对。看着这个题给出的范例我最开始以为需要读入,计数并且排序,两个相关联的数据,很自然的就想到了map容器。

map容器处理关联问题

#include <bits/stdc++.h>

using namespace std;

int main()
{
    int n;
    scanf("%d",&n);
    //读入字符?
    //通过map建立key(字母)与value(次数)之间的映射
    //接收输入->find()查找是否有该key->无则insert map/有则更改value
    for(int i=0;i<n;i++){
        map<char,int> m;
        string s;
        cin>>s;
        char ch;
        for(int i=0;i<s.length();i++)
        {
            ch=s[i];
            if(m.find(ch)!=m.end()){//如果已经有了
                m.find(ch)->second++;//那么次数加一//访问方式类似指针
            }
            else{
                m.insert(pair<char,int>(ch,1));//初始插入value为1
            }
        }
        for(auto x:m){
            if(x.second!=1){cout<<x.second<<x.first;}
            else{cout<<x.first;}
        }
    }
    return 0;
}

想法单纯。结果第一次提交错了。崩溃。
然后想到了可能不是需要排序的,但是map又是自动排序的,就很为难。然后查用法,学到了可以用结构体/数组作为map的key或者value,但是key不能随意更改,所以肯定不能用来key来存次数。

所以尝试了用结构体作为map的value。有如下代码:

结构体做map的value

struct val{
    int a;
    int b;
    bool operator < (const val &o) const{
        return b<o.b;
    }
};

int main()
{
    int n;
    scanf("%d",&n);
    //读入字符?
    //通过map建立key(字母)与value(次数)之间的映射
    //接收输入->find()查找是否有该key->无则insert map/有则更改value
    for(int i=0;i<n;i++){
        // vector <char> vec;
        // vector <int> c(100,0);
        map<char,val> m;
        val v;
        string s;
        cin>>s;
        char ch;
        for(int i=0;i<s.length();i++)
        {
            ch =s[i];
            if(m.find(ch)!=m.end()){//如果已经有了
                m.find(ch)->second.a++;//那么次数加一//访问方式类似指针
            }
            else{
                v.b=i;
                v.a=1;
                m.insert(pair<char,val>(ch,v));//初始插入value为1
            }
        }
        for(auto x:vec){
            if(c[x]!=1){cout<<c[x]<<x;}
            else{cout<<x;}
        }
        cout<<endl;
    }
    system("pause");
    return 0;
}

值得注意的是,利用结构体作为map内元素进行赋值的时候,需要建立一个该结构体的变量用以接收值,再将结构体整体用pair/make_pair赋给map。

后来发现也不行。虽然我能储存了这个输入的顺序,但是输出的时候我需要两个循环遍历才能按照我b的大小顺序输出而且还得判断是否是重复的。

至此,心态崩溃60%.

为什么只是60%

因为我在搞结构体作为value的早就想到了更简单的方法:两个数组,用字符作为下标来计数共有多少个A,B···字符。

int main()
{
    int n;
    scanf("%d",&n);
    //读入字符?
    //通过map建立key(字母)与value(次数)之间的映射
    //接收输入->find()查找是否有该key->无则insert map/有则更改value
    for(int i=0;i<n;i++){
        vector <char> vec;
        vector <int> c(100,0);
        // map<char,val> m;
        // val v;
        string s;
        cin>>s;
        char ch;
        for(int i=0;i<s.length();i++)
        {
            ch =s[i];
            if(find(vec.begin(),vec.end(),ch)!=vec.end()){c[ch]++;}
            else{vec.push_back(ch);c[ch]++;}
        }
        for(auto x:vec){
            if(c[x]!=1){cout<<c[x]<<x;}
            else{cout<<x;}
        }
        cout<<endl;
    }
    system("pause");
    return 0;
}

最后依然WA,心态崩溃99%了。

最后反复看题,反复看题,看着A2B3C这个数据,我醍醐灌顶,心中大叫一声马赛卡!!!。然后写出了AC代码如下:

AC代码

#include <iostream>
#include <stdio.h>
#include <cstring>

using namespace std;

int main()
{
    int n;
    scanf("%d",&n);
    for(int i=0;i<n;i++){
        char temp;
        string s;
        cin>>s;
        char pre=s[0];
        for(int i=1,c=1;i<s.length();i++){
            if(s[i]==pre){
                pre=s[i];
                c++;
                if(i==s.length()-1){
                    cout<<c<<pre;
                }
            }
            else{
                if(c!=1){cout<<c<<pre;c=1;pre=s[i];}
                else{cout<<pre;pre=s[i];}
                if(i==s.length()-1){
                    cout<<pre;
                }
            }
        }
        cout<<endl;
    }
    return 0;
}

最后其实连容器都没用到。简单得我想自戕。

关于嵌套map

在最开始读错题意的时候,想到过用嵌套map,外层map用以根据输入顺序排序
如map<int,map<char,int>> m;
第一个int接收输入时i的大小,第二个int自然就是计数了。但是在测试输入为ABC的时候却错误输出了AABABC。其实就是根据第一个int顺序存的其实是当时的内层map,在只读入一个A的时候,内层map为map[‘A’]==1;然后输出就是只输出一个A。至于内层map其实还是在自动排序。

基于 OptiSystem 的掺铒光纤放大器(EDFA)分析 通过构建 EDFA 仿真模型,系统分析了铒离子掺杂半径、离子浓度、光纤长度及泵浦功率等关键参数对放大器增益和噪声特性的影响规律,为 EDFA 的优化设计提供了理论依据与仿真支撑。继续增大至 9μm,增益趋于稳定(约 19dB)。继续增加至 200mW,增益仅增加 2dB,表明泵浦功率存在阈值效应(约 100mW),超过后增益饱和明显。:作为增益介质,主要参数包括光纤长度(5~50m)、铒离子掺杂半径(1~10μm)、离子浓度(1×10²⁵~5×10²⁵m⁻³)、纤芯半径 2.2μm、数值孔径 0.24。 阅读详情

相关推荐

【翼型】基于Matlab的NACA翼型气动性能仿真与优化【附源码】

本文详细介绍了如何使用Matlab进行NACA翼型的气动性能仿真与优化。内容涵盖从生成NACA翼型坐标、利用面板法快速估算升阻力,到进阶的粘性流模拟与优化设计入门。通过清晰的代码示例和分步指南,帮助读者掌握基于Matlab的翼型分析与优化流程,为飞行器或叶片设计提供实用工具和方法。

weixin_29032489的博客 409

c++中结构体作为map的value及两种遍历方式的区别

在使用结构体作为map的value时,如果需要修改结构体成员的值,使用方式遍历找到需要修改的元素,并对结构体成员赋值,该操作并不能实现对结构体成员的修改。这是因为方式循环遍历map时,返回的是一个对象的副本,而不是对象的引用。因此,在修改结构体成员时,应该使用迭代器方式循环遍历。这样,返回的就是对象的引用,可以成功修改结构体成员的值。

sucaptain的博客 1560

测试丢包_电信IPRAN承载LTE业务丢包故障处理案例

银川 景旭阳电信IPRAN承载LTE业务丢包故障处理案例一.故障现象某地市IPRAN网络承载LTE基站业务,客户反馈近期丢包严重,基站侧ping侧核心网EPC丢包达到10%左右;且基站数量在10个左右,并分布在同一地区,需要IPRAN网络协助排查;随后查看了IPRAN网络;发现这些业务所在基站的PW-BFD历史告警存在频繁的UP/DOWN告警;综上信息展开故障处理,初步判断由于BFD频繁...

weixin_29740921的博客 1912

学习笔记:C++关于map中key与value皆为结构体时的用法demo

最近在学习C++有一个需求:我希望构建一个map,其中key为一个结构体,这个结构体中包括他的名字和年龄;map的value为数组,为了方便处理,我将其处理为了另一个结构体,结构体中包括了一个三门成绩的整型数组。 代码如下: #include <iostream> #include <map> struct Man{ std::string name; in...

明柳梦少的博客 3611

超详细 | 贝叶斯网络基础——有图有真相

Hello,大家好,我是starz。这是本系列的第二篇《概率基础Ⅱ》,虽说是概率基础,但作为过渡,它开始以图为载体 这节的主要内容有: 贝叶斯网络 三种结构 D-划分 贝叶斯球 马尔科夫毯 应用例子 总结 让我们开始吧 :3 贝叶斯网络 概率图模型可笼统分为两类,一是基于无向图的马尔科夫网络: 二是基于有向图的贝叶斯...

qq_41603411的博客 2万+

Anaconda/Miniconda的删除和安装

要在 MacBook 上删除 Anaconda 或 Miniconda,并重新安装它,您可以按照以下步骤进行操作。

qq_27390023的博客 3026

map:涉及value为结构体,

#include<iostream> #include<cstdio> #include<map> using namespace std; const int maxn=100005; struct node { int index1;//存储下标 int tag;//tag=1表示已有前面已有一个相同的数 int index2; nod...

qq_43661234的博客 1915

AI大模型应用性能核心指标:TTFT 与 TPOT 详解

这两个指标专门衡量大模型流式响应性能,是评估用户体验的关键指标。· 是什么:从请求到第一个输出的等待时间· 为什么重要:决定用户的第一印象和响应感知· 优化方向:模型加载、预处理、冷启动优化· 行业标准:最好<500ms,可接受<1.5s· 是什么:每个输出token的平均生成时间· 为什么重要:决定流式输出的流畅度和总完成时间· 优化方向:推理引擎、内存带宽、批处理优化· 行业标准:最好<50ms/token,可接受<100ms/token在Dify/大模型应用中的意义。

lovehu6686的博客 3960

结构体作为map的键值

 这里首先给出容器map的原型: 1 2 3 4 5 6 7 8 template< classKey, classT, classCompare = less<Key>, classAlloc = alloc> classmap{ ... }   可以看到模板参数一共有四个,第...

qq_35886593的博客 1188

金融领域图注意力网络的创新应用

随着金融市场的日益复杂和数据量的爆炸式增长,传统的数据分析方法在处理金融数据的复杂关系和结构时面临诸多挑战。图注意力网络(Graph Attention Network,GAT)作为一种新兴的深度学习技术,能够有效处理图结构数据,挖掘数据中的潜在关系。本文的目的在于深入探讨图注意力网络在金融领域的创新应用,涵盖风险评估、投资决策、欺诈检测等多个方面。通过理论分析、算法实现和实际案例展示,为金融从业者和研究者提供全面的技术参考,推动图注意力网络在金融领域的广泛应用。

AI云原生与云计算技术学院 719

黑猫带你学eMMC协议第29篇:eMMC设备锁详解(CMD42)

通过cmd42命令,可以给emmc设置密码,并且锁定emmc。这时候就不能对emmc的user分区进行读写数据访问了。设备锁在V4.3版本后的emmc里面,就只能保护user area分区,因此,被锁定的emmc,依旧可以正常访问BOOT\RPMB\GPP分区。emmc内部有128 bit PWD寄存器,用来存放密码,以及有8bit PWD_LEN寄存器,用来密码长度。这两个寄存器非易失性,掉电也不会丢失。

黑猫奥利奥的博客 3237

在map中使用结构体

在std::map中使用结构体

SuperLi 2730

python中使用squarify包可视化treemap图:为treemap图添加标题并自定义标题的字体大小、自定义设置treemap中标签字体的大小、添加数值数值标签、自定义设置边框的色彩

python中使用squarify包可视化treemap图:treemap将分层数据显示为一组嵌套矩形自定义设置每一个数据格的颜色、添加数值数值标签、自定义设置边框的色彩、自定义设置边框线条的粗细、为treemap图添加标题并自定义标题的字体大小、自定义设置treemap中标签字体的大小

data+scenario+science+insight 1061

std::map 如何使用结构体作为自定义键值

在使用map时,有时候我们需要自定义键值,才能符合程序的需要。 比如我们需要使用自定义的结构体来作为map的键值.

GreenArrowMan-优快云博客 1万+

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

map 如何使用结构体作为自定义键值

在使用map时,有时候我们需要自定义键值,才能符合程序的需要。 比如我们需要使用自定义的结构体来作为map的键值: struct Test { int x; int y; }; 这样直接使用的话,在编译时会出问题: 1&gt;------ Build started: Project: MapRemove, Configuration: Debug Win32 ...

线上幽灵 4899

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

go语言学习笔记7,结构体与map、函数参数,指针的定义和使用,指针和数组、切片、结构体,多级指针

结构体作为map中的value 我们使用make开辟了一个map的空间,并且int为键结构体的student为值。 我们创建了101和102并且给student赋值。 如果想要删除,就用delete方法删除m中的键。 这个value的类型是一个切片,一个键中的value可以有多个值可以用append方法添加值。 结构体作为函数参数 首先我们使用自定义类型创建了一个stu,然后作为函数参数传过...

盛难晨 848

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

map结构体作为key值的使用

最近在使用stl中的map容器时,碰到key为结构体的情况,总结如下,以便提醒自己。 因为之前从没用结构体作为key值,也就没出现这种情况,结果报错后很崩溃看不懂 后来才知道map中的key默认是以less 所以要对结构体中 然后就可以使用了

codeswarrior的博客 5259

能懂系列之 Map 详解

长按识别下方二维码,即可"关注"公众号每天早晨,干货准时奉上!序今天我们来说一说java中超级重要的map集合.1、map集合概述publicinterfaceMap...

Java学习之道 6114

C++中stl容器map针对结构体的查找

#include #include #include #include using namespace std; typedef struct MAPDATA { char data[128]; //map中数据 bool operator {  return a.data } }MAPDATA; int main() { map mp; stru

Never too late to study 2277

c++ map: 使用struct或者数组做value

Notice 如果是program中有两个map对象,可能你需要两个map iterator,但是注意两个iter object不能命名一样,可以分别为iter1, iter2 Example #include <iostream> #include <map> using namespace std; struct Triple { int color [3...

weixin_33883178的博客 5171

查找学生信息【清华复试机试题】【map 结构体做value值】

题目描述 输入N个学生的信息,然后进行查询。 输入描述: 输入的第一行为N,即学生的个数(N<=1000) 接下来的N行包括N个学生的信息,信息格式如下: 01 李江 男 21 02 刘唐 男 23 03 张军 男 19 04 王娜 女 19 然后输入一个M(M<=10000),接下来会有M行,代表M次查询,每行输入一个学号,格式如下: 02 03 01 04 输出描述: 输出M行,每行包括一个对应于查询的学生的信息。 如果没有对应的学生信息,则输出“No Answer!” 示例

han_hhh的博客 309

常见三维文件格式之VRML & X3D

VRMLVRML是类似C的结构化数据,易读性好,但用程序数据提取出来困难。#VRML V2.0 utf8Shape{ appearance Appearance #定义物体的外观属性 { material Material #定义材质属性 { emissiveColor 1 0 0 #表示球的表面材质反射红光 } } geo...

weixin_30920853的博客 846

C++ map根据value进行排序,以及sort中cmp比较器的实现

这篇文章根据leetcode中的第451题:根据字符出现频率排序 链接:leetcode 451 根据字符出现频率排序 来实现map的根据value值进行排序 看了网上很多内容,整理下: 一、按Key排序 map内部本身按序存储的(比如红黑树),这样方便实现快速查找。在我们插入 <key, value>键值对时,map就会自动按照key的大小顺序进行存储。因而作为key的 类型必须能够进行大小运算的比较。比如int、double、string、char等类型 二、按Value

偏执狂的博客 3409
上一篇: 东华 OJ 一维数组竞赛 等差数列
下一篇: 东华OJ 选课时间
Pure_Silly
博客等级 码龄6年 170粉丝 22原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值