今天写了一个很蹩脚的算法(实现过程有些复杂,也可能有一些bug,需要优化):
输入一个字符集如"a:3,b:5,C:12,d:100@a:1,b:5,C:9",@前属于全字符集,后面是使用字符集,数字部分代表使用数量;字母区分大小写,字符集间用逗号隔开。
要求输出剩余可用字符集如上结果为"a:3,b:0,C:3"
实现代码如下:
#include <iostream>
(720)#include <vector>
using namespace std;
vector<string> cutStr(string str){
int len = static_cast<int>(str.size());
vector<string> ch_set(str.size());
int start=0;
int n=0;
for(int i=0;i<len;++i){
if(str[i]==,){
ch_set[n] = str.substr(start,i-start);
start = i+1;
n++;
}
if(i==len-1){
ch_set[n] = str.substr(start,i-start+1);
}
}
ch_set.resize(n+1);
return ch_set;
}
输入一个字符集如"a:3,b:5,C:12,d:100@a:1,b:5,C:9",@前属于全字符集,后面是使用字符集,数字部分代表使用数量;字母区分大小写,字符集间用逗号隔开。
要求输出剩余可用字符集如上结果为"a:3,b:0,C:3"
实现代码如下:
#include <iostream>
(720)#include <vector>
using namespace std;
vector<string> cutStr(string str){
int len = static_cast<int>(str.size());
vector<string> ch_set(str.size());
int start=0;
int n=0;
for(int i=0;i<len;++i){
if(str[i]==,){
ch_set[n] = str.substr(start,i-start);
start = i+1;
n++;
}
if(i==len-1){
ch_set[n] = str.substr(start,i-start+1);
}
}
ch_set.resize(n+1);
return ch_set;
}
2020-07-27
在牛客打卡1天,今天也很努力鸭!
全部评论
接上:
string compAndSetValue(string avail_str, string use_str){ // a:5 & a:3 => a:2
int len1 = avail_str.size();
int index1 = avail_str.find(':');
string a_pre_str = avail_str.substr(0,index1);
string a_post_str = avail_str.substr(index1+1,len1-1-index1);
int a_num;
sscanf(a_post_str.c_str(),"%d",&a_num); // convert string to number
int len2 = use_str.size();
int index2 = use_str.find(':');
string u_pre_str = use_str.substr(0,index2);
string u_post_str = use_str.substr(index2+1,len2-1-index2);
int u_num;
sscanf(u_post_str.c_str(),"%d",&u_num); // convert string to number
if(a_pre_str==u_pre_str){
a_num -= u_num;
char ch_num[10]; //const_cast<char*>(a_post_str.c_str())
sprintf(ch_num,"%d",a_num); // convert number to string
a_post_str = ch_num;
avail_str = a_pre_str + ':' + a_post_str;
}
return avail_str;
}
string outputAvailSet(vector<string> avail_set, vector<string> used_set){
int a_len = avail_set.size();
int u_len = used_set.size();
for(int i=0;i<u_len;++i){
for(int j=0;j<a_len;++j){
avail_set[j] = compAndSetValue(avail_set[j],used_set[i]);
}
}
string str;
for(int i=0;i<a_len;++i){
if(i<a_len-1){
str += avail_set[i] + ',';
}else{
str += avail_set[i];
}
}
return str;
}
int main(int argc, char *argv[])
{
string str = "a:3,b:5,C:12,d:100@a:1,b:5,C:9"; //input
unsigned long long cut_point = str.find('@');
int len = str.size();
string str1 = str.substr(0,cut_point);
string str2 = str.substr(cut_point+1,len-1-cut_point);
vector<string> avail_set = cutStr(str1);
vector<string> used_set = cutStr(str2);
string avail_set_str = outputAvailSet(avail_set,used_set);
cout<<avail_set_str<<endl; //output
return 0;
}
相关推荐
点赞 评论 收藏
分享
10-30 18:20
第一拖拉机制造厂拖拉机学院 C++
牛客41406533...:回答他在课上学,一辈子待在学校的老教授用三十年前的祖传PPT一字一句的讲解,使用谭浩强红皮书作为教材在devc++里面敲出a+++++a的瞬间爆出114514个编译错误来学 点赞 评论 收藏
分享
11-15 08:21
江西理工大学 数据分析师 点赞 评论 收藏
分享
