今天写了一个很蹩脚的算法(实现过程有些复杂,也可能有一些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;
}
相关推荐
点赞 评论 收藏
分享